对于0xff来说,不按位和AND基本上意味着得到相同的值,在这段代码中呢?
byte[] packet = reader.readPacket(); short sh; sh = packet[1]; sh &= 0xFF; System.out.print(sh+" ");
奇怪的是,如果ANDing不包括但是包含255则可以得到-1可能有人解释原因?
正如我所看到的那样,0xff只是1111 1111.不是吗?
解决方法
是的,0xff只是1111 1111.但这是尝试显示无符号字节值,即使在Java字节中被签名.对于有符号字节,0xff的值为-1,而在短时间内为255.
当读取字节值0xff时,打印该值会产生-1.因此,它被分配给具有更大范围的短,并且可以存储正常溢出为负数的字节值作为正整数的字节,例如. 144为一个字节是0x90或-112,但它可以正确存储为144作为一个短.
所以-1的字节值被分配给一个short.但是做什么呢?发生原始的扩展转换,负值被符号扩展.所以1111 1111变成11111111 11111111,仍然是-1,但这个时间是短暂的.
然后使用位掩码0xff(00000000 11111111)再次获取最后的8位:
-1: 11111111 1111111 0xFF: 00000000 1111111 ====================== 255: 00000000 1111111