1

由于 Java 中的 'byte' 是 8 位,而 '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”(零)。为什么会这样?

4

3 回答 3

4

您正在做的是将初始值向左移动:

0000 0000 1111 1111  
<<=8  
1111 1111 0000 0000 

然后,您正在对 0xFF 进行按位与运算:

1100 0011 0000 0000  
&  
0000 0000 1111 1111  
==  
0000 0000 0000 0000  

因此,您的最终结果为 0。

于 2013-09-27T23:53:05.850 回答
3

代码首先左移 8 位。因此,您将所有正确的 8 位设置为 0。

然后你用 0xFF 和它,它留下了大多数 8 位 0。

所以你的最终结果全是0!

附加评论:避免使用 Java 的 short 是一个很好的做法,因为 Java 将 int 以下的所有内容都类型转换为 int。此外,从您的代码中也不清楚您期望什么输出。如果您添加其他信息,就很容易准确地发现您尝试实现的逻辑需要做什么。

于 2013-09-28T00:02:43.740 回答
1

一步一步完成:

sh = (short)0xff;  //Since you said that packet[1] holds '0xff'

所以现在sh = 0x00ff。接下来,考虑转变sh <<= 8;。之后,sh = 0xff00.

我会把最后一个留给sh &= 0xFF;你(希望能清楚为什么&op 设置sh为 0)。

于 2013-09-27T23:56:32.530 回答