两个字符的按位与打印错误的结果

Bitwise AND of two Chars prints wrong result

当我 运行 这个代码时 -

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

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

我不明白为什么会这样?如果我使用 XOR 运算符,它会打印 1 和 0。我已经看到 & 和 | 的这种行为操作员。 可以在此处的 IdeOne 中访问代码 - https://ideone.com/fqZFUY.

两个char之间的&操作的类型是int。你试试看就知道了:

var res = '0' & '0';

你看看res的类型。 (从技术上讲,这称为 "binary numeric promotion",在这种情况下,两个 char 都转换为 int,然后 & 在两个 int 之间完成, 显然结果是 int。如果你有兴趣,可以解释 here)

因此,作为 int 的结果,Console.WriteLine 将其格式化为 int

尝试

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

'0' 十进制代码为 48,二进制代码为 110000。

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

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

110001 & 110001 == 110001 == 49 十进制

因此,当您执行 Console.WriteLine(binNumber[ind]&'1'); 时,您会得到 48 或 49,具体取决于 binNumber[ind] 是“0”还是“1”。

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