我试图理解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上执行XOR,然后用0xff掩码它。 byte1 ^ byte2给出的值为-128。当我用结果和11111111执行AND时,我得到128.这是否意味着,要将有符号字节转换为无符号字节,我们用0xff掩码它?我试图理解它是如何工作的,因为它很混乱。任何帮助都非常感谢。谢谢!
答案 0 :(得分:1)
当你" upcast"整数基元类型,符号位被携带。
在:
int x = byte1 ^ byte2;
实际上,两个字节都转换为整数。由于byte2
是(二进制)1000 0000
,又名0x80,因此其整数值为... 0xffffff80。
在你的第二个例子中,byte1 ^ byte2也给出0xffffff80,但是由于你和它的0x000000ff,你得到的是0x00000080,即128.
请注意,从Java 7开始,您可以byte b = (byte) 0b1000_0000
;在您的情况下,您可能希望使用二进制而不是十六进制,但这是您的选择。