我是Java的新手,我对Java中的签名字节感到困惑。
byte a = -128;
byte b = 126;
System.out.println((byte)(a ^ b));
输出为-2。有人可以解释为什么我们得到这个? -2是-128 XOR 126的正确结果吗?
另一个问题是我有一个字节b,我希望它对所有可能的字节进行异或,我的代码是
byte i = -128
while (i <= 127) {
byte c = (byte) b ^ i;
i++;
}
这是对的吗?
答案 0 :(得分:1)
这是关于计算机中已签名号码的表示。它们表示为2s-complement。这意味着:
126 = 0111 1110
-128 = 1000 0000
-2 = 1111 1110
2s补码中的负值是通过将绝对值作为二进制数,反转除MSB之外的所有位,将结果加1,并将用作符号位的MSB设置为1来形成的,例如:< / p>
-3:
0000 0011 absolute value (3)
0111 1100 invert all bits except MSB
0111 1101 add 1
1111 1101 set MSB to 1
答案 1 :(得分:0)