两个字符的按位与打印错误的结果
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
,编译器会对这些字符的数值执行按位与运算。
当我 运行 这个代码时 -
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
,编译器会对这些字符的数值执行按位与运算。