java 中的异或符号字节

XOR signed bytes in java

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

是否正确?

二进制数学非常简单...

-128在8位中是10000000(别忘了是2补码) 126 在 8 位中是 01111110

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

这是关于计算机中有符号数的表示。它们表示为 2s-complement。这意味着:

126   = 0111 1110
-128  = 1000 0000
-2    = 1111 1110

2s补码中的负值是将绝对值作为二进制数,将除MSB外的所有位取反,结果加1,并将用作符号位的MSB设置为1,例如。 :

-3:
0000 0011  absolute value (3)
0111 1100  invert all bits except MSB
0111 1101  add 1
1111 1101  set MSB to 1