java中的XOR签名字节

时间:2016-11-28 22:10:50

标签: java byte xor

我是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++;
}

这是对的吗?

2 个答案:

答案 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)

二进制数学很直接......

8位

-128 10000000 (不要忘记是2补码) 8位 126 01111110

然后你得到 1111 1110 :这是8位2补码中的-2

enter image description here