按位 - 与0xff的ANDing很重要吗?

与0xff按位ANDing本质上不意味着在此代码中取回相同的值吗?

byte[] packet = reader.readPacket();
short sh;
sh = packet[1];
sh &= 0xFF;
System.out.print(sh+" ");

奇怪的是,如果不包括该ANDing,我得到一个-1,但是当包含时,我得到一个255有人可以解释原因吗?

正如我所看到的,0xff只是1111 1111。不是吗?


答案 1

是的,只是.但这是试图显示无符号字节值,即使在Java中,s是有符号的。该值用于有符号 ,但它位于 .0xff1111 1111byte0xff-1byte255short

读取 值时,打印该值将产生 。因此,它被分配给具有更大范围的a,并且可以将通常溢出为负数的值存储为正整数,例如144作为is或-112,但它可以正确存储为。byte0xff-1shortbytebytebyte0x90144short

因此,的值被分配给 .但这有什么作用呢?将进行基元加宽转换,并且负值是符号扩展的。所以成为,仍然,但这次作为.byte-1short1111 111111111111 11111111-1short

然后使用位掩码()再次取出最后8位:0xff00000000 11111111

  -1: 11111111 1111111
0xFF: 00000000 1111111
======================
 255: 00000000 1111111

它只是获取无符号值的一种方法,方法是将其转换为 ,然后从 中屏蔽原始位,以将其显示为无符号值。byteshortbyte


答案 2

A 的范围为 -128 到 127。这意味着某些值为负数。这是设置顶位的所有值。-1 也是如此。当您使用符号扩展名使其成为有符号短时,它将变为 -1 作为短路。当你屏蔽它时,它会砍掉扩展位,你对待这个字节,就好像它在无符号的地方一样。byte(byte) 0xFF(short) 0xFFFF


你不会得到 -1,除非你的代码与问题中的代码不同。

for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++) {
    short s = b;
    s &= 0xff;
    System.out.println(b + " & 0xFF = " + s);
}

指纹

-128 & 0xFF = 128
-127 & 0xFF = 129
....
-2 & 0xFF = 254
-1 & 0xFF = 255
0 & 0xFF = 0
1 & 0xFF = 1
...
125 & 0xFF = 125
126 & 0xFF = 126