左移左边产生零

时间:2013-09-27 23:47:43

标签: java bit-manipulation bit-shift

由于'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'(零)。为什么会这样呢?

3 个答案:

答案 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的原因。