两个Chars的按位AND打印错误结果

时间:2015-06-11 08:33:23

标签: c# types char

当我运行此代码时 -

string binNumber="11111000001";
for(int ind=0; ind<binNumber.Length; ind++){
   Console.WriteLine(binNumber[ind]&'1');
}

它打印49和48而不是1和0的序列。

我无法理解为什么会这样?如果我使用XOR运算符,它会打印1s&amp; 0。我已经看到了这种行为。和|运营商。 可以在IdeOne中访问代码 - https://ideone.com/fqZFUY

2 个答案:

答案 0 :(得分:1)

'0'的代码为48(十进制)或110000(二进制)。

'1'的代码为十进制49,或二进制为110001。

110000&amp; 110001 == 110000 == 48十进制

110001&amp; 110001 == 110001 == 49十进制

所以当你Console.WriteLine(binNumber[ind]&'1');时,你会得到48或49,具体取决于binNumber[ind]是'0'还是'1'。

请记住,如果执行someChar & someOtherChar,编译器会对这些字符的数值进行按位AND运算。

答案 1 :(得分:0)

两个&之间的char操作类型为int。如果您尝试,可以看到它:

var res = '0' & '0';

然后查看res的类型。 (从技术上讲,这称为“二进制数字促销”,在这种情况下会发生的情况是char都转换为int,然后&在两个int之间完成,显然结果是int。如果您感兴趣,请解释here

结果是intConsole.WriteLine将其格式化为int

尝试

Console.WriteLine((char)(binNumber[ind]&'1'));