两个字符的按位与输出错误结果

本文关键字:位与 输出 错误 结果 字符 两个 | 更新日期: 2023-09-27 17:55:04

当我运行这段代码-

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

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

我不明白为什么会发生这种事?如果我使用异或运算符,它会输出1 &0年代。我在&和|运算符。代码可以在IdeOne中访问- https://ideone.com/fqZFUY.

两个字符的按位与输出错误结果

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

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

110000,110001 == 110000 == 48 decimal

110001,110001 == 110001 == 49 decimal

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

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

两个char之间的&操作类型为int。你可以输入:

var res = '0' & '0';

,看看res的类型。(从技术上讲,这被称为"二进制数字提升",在这种情况下发生的是,两个char都转换为int,然后&在两个int之间完成,显然结果是int。如果你感兴趣,这里有解释)

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

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