字节异或运算

XOR operation on bytes

我正在尝试了解 XOR 在字节上的工作原理

    byte byte1 = (byte)0x00;
    byte byte2 = (byte)0x80;
    int x = ((byte1^byte2));
    System.out.println("Value of X is "+x);
    int x1 = ((byte1^byte2)&0xff);
    System.out.println("Value of X1 is "+x1);

显示的输出是:

   Value of X is -128
   Value of X1 is 128

这里我尝试对byte1和byte2进行异或,然后用0xff屏蔽。 byte1^byte2 给出了 -128 的值。当我对结果执行 AND 和 11111111 时,我得到 128。这是否意味着,要将有符号字节转换为无符号字节,我们用 0xff 屏蔽它?我试图了解它是如何工作的,因为它非常令人困惑。非常感谢任何帮助。谢谢!!

当你"upcast"整数基本类型时,符号位被携带。

在:

int x = byte1 ^ byte2;

事实上,两个字节都被转换为整数。由于 byte2 是(二进制)1000 0000,又名 0x80,它的整数值将是... 0xffffff80.

在你的第二个例子中,byte1 ^ byte2 也给出了 0xffffff80,但是因为你和它有 0x000000ff,所以你得到 0x00000080,也就是 128。

请注意,由于 Java 7 你可以做到 byte b = (byte) 0b1000_0000;在您的情况下,您可能希望使用二进制而不是十六进制,但这是您的选择。