2013-09-27 54 views
1

由於「字節」是8位和「短」是在Java中的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

你覺得'sh&= 0xFF;'是嗎? –

+0

也許它應該是0xFFFF? –

+0

當你使用'<< = 8'時,你將低位全部設爲0,所以當你只屏蔽低位時,你就會得到零。 –

回答

4

你在做什麼是初始值左移:

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

然後,你做的位與0xFF的:

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

因此,您的最終結果是0

+0

OP在他的評論中說「0xff」是初始值。 「1101 0011 1100 0011」是否只是一個通用的示例值? –

+0

啊,沒有注意那個評論。這僅僅是一個例子;無論初始值如何,他都會得到相同的結果。 –

+0

我同意,答案將是一樣的。只是檢查我是不是** **生鏽在我的十六進制:) –

1

經過這一步步驟:

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

所以現在sh = 0x00ff。接下來,考慮轉變sh <<= 8;。之後,sh = 0xff00

我會離開最後sh &= 0xFF;給你(應該希望清楚爲什麼& op設置sh爲0)。

3

該代碼首先左移8個位置。所以,你有最多8位設置爲0。

然後你和它使用0xFF已經離開最多8位0

的所有權利所以你的最終結果是全0!

附加註釋:避免使用Java的簡寫爲Java是一種很好的做法,因爲Java會將int下面的所有內容以int形式進行類型化。另外,從代碼中不清楚你期望的輸出。如果您添加其他信息,可以很容易地發現您正試圖實施的邏輯需要完成的工作。