我很想知道使用二进制文字进行按位比较时实际发生了什么。我刚刚遇到以下事情:
byte b1 = (new Byte("1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0'));
// output: 00000001
System.out.println(b1 ^ 0b00000001);
// output: 0
所以一切都按预期运行,xor
比较等于0
。但是,当尝试使用负数时,它将不起作用:
byte b2 = (new Byte("-1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111
System.out.println(b2 ^ 0b11111111);
// output: -256
我本来希望最后一个xor
比较也等于0
. 但是,只有当我将二进制文字显式转换为byte
:
byte b2 = (new Byte("-1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111
System.out.println(b2 ^ (byte)0b11111111);
// output: 0
对我来说,在比较之前看起来像xor
两者b1
并且0b11111111
具有相同的位表示,所以即使它们被强制转换为int
(或其他东西),xor
应该仍然相等0
。您如何得出二进制表示-256
的结果?11111111 11111111 11111111 00000000
为什么我必须进行显式强制转换byte
才能获得0
?