由於「字節」是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'(零)。爲什麼會這樣呢?
由於「字節」是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'(零)。爲什麼會這樣呢?
你在做什麼是初始值左移:
0000 0000 1111 1111
<<=8
1111 1111 0000 0000
然後,你做的位與0xFF的:
1100 0011 0000 0000
&
0000 0000 1111 1111
==
0000 0000 0000 0000
因此,您的最終結果是0
OP在他的評論中說「0xff」是初始值。 「1101 0011 1100 0011」是否只是一個通用的示例值? –
啊,沒有注意那個評論。這僅僅是一個例子;無論初始值如何,他都會得到相同的結果。 –
我同意,答案將是一樣的。只是檢查我是不是** **生鏽在我的十六進制:) –
經過這一步步驟:
sh = (short)0xff; //Since you said that packet[1] holds '0xff'
所以現在sh = 0x00ff
。接下來,考慮轉變sh <<= 8;
。之後,sh = 0xff00
。
我會離開最後sh &= 0xFF;
給你(應該希望清楚爲什麼&
op設置sh
爲0)。
該代碼首先左移8個位置。所以,你有最多8位設置爲0。
然後你和它使用0xFF已經離開最多8位0
的所有權利所以你的最終結果是全0!
附加註釋:避免使用Java的簡寫爲Java是一種很好的做法,因爲Java會將int下面的所有內容以int形式進行類型化。另外,從代碼中不清楚你期望的輸出。如果您添加其他信息,可以很容易地發現您正試圖實施的邏輯需要完成的工作。
你覺得'sh&= 0xFF;'是嗎? –
也許它應該是0xFFFF? –
當你使用'<< = 8'時,你將低位全部設爲0,所以當你只屏蔽低位時,你就會得到零。 –