与0xff进行逐位AND运算很重要?

Sha*_*esu 13 java byte short bitwise-operators bitwise-and

对于这个问题,在这段代码中,不与0xff进行逐位AND运算实际上意味着返回相同的值吗?

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

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

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

rge*_*man 24

是的,0xff只是1111 1111.但这是尝试显示无符号字节值,即使在Java中byte已签名.该值0xff-1签名的byte,但它255在一个short.

byte价值0xff被读取,打印值将产生-1.所以它分配给short具有更大的范围,并且可以存储byte通常会溢出到是负数作为值byte作为正整数,例如144作为byte0x90,或-112,但它可以被适当地存储为144作为short.

所以将byte-1赋给a short.但这又是什么呢?进行原始扩展转换,并对负值进行符号扩展.因此1111 1111变得11111111 11111111-1,但这次作为short.

然后bitmask 0xff(00000000 11111111)用于再次输出最后8位:

  -1: 11111111 1111111
0xFF: 00000000 1111111
======================
 255: 00000000 1111111
Run Code Online (Sandbox Code Playgroud)

这只是获取无符号byte值的一种方法,通过将其转换为short然后屏蔽原始位,将byte其显示为无符号值.