由于'byte'是8位而Java中的'short'是16位,我相信这应该 -
byte[] packet = reader.readPacket();
short sh;
sh = (short)packet[1]; //packet[1] holds '0xff'
sh <<= 8;
sh &= 0xFF;
System.out.print(sh+" ");
产生一些大的正值,因为较低的8位被提升到更高的8位。
相反,我收到'0'(零)。为什么会这样呢?
答案 0 :(得分:4)
您正在做的是将初始值移到左侧:
0000 0000 1111 1111
<<=8
1111 1111 0000 0000
然后,你正在使用0xFF进行按位AND:
1100 0011 0000 0000
&
0000 0000 1111 1111
==
0000 0000 0000 0000
因此,您的最终结果是0。
答案 1 :(得分:3)
代码首先向左移动8位。因此,您将所有最右边的8位设置为0。
然后你用0xFF将它与大多数8位0保持一致。
所以你的最终结果都是0!
附加说明:避免使用Java短路是一种很好的做法,因为Java将int下面的所有内容都命名为int。此外,从您的代码中不清楚您期望的输出。如果您添加其他信息,则很容易找到您要尝试实施的逻辑需要完成的工作。
答案 2 :(得分:1)
逐步完成:
sh = (short)0xff; //Since you said that packet[1] holds '0xff'
现在sh = 0x00ff
。接下来,考虑班次sh <<= 8;
。之后,sh = 0xff00
。
我会将最后sh &= 0xFF;
留给您(希望明确&
操作将sh
设置为0的原因。