0
邏輯移位錯誤這一個正常工作:的Java帶有小數
short x = (short)(0xffff >>> 10);
即X = 3F(63)
但是,當完成相同的步驟,但用小數表示:
short x = (short)((short)(-1) >>> 10);
那麼x仍然是FFFF(-1)。
爲什麼發生?
邏輯移位錯誤這一個正常工作:的Java帶有小數
short x = (short)(0xffff >>> 10);
即X = 3F(63)
但是,當完成相同的步驟,但用小數表示:
short x = (short)((short)(-1) >>> 10);
那麼x仍然是FFFF(-1)。
爲什麼發生?
因爲short
-1
被晉升爲int
與價值-1
,這就是:
1111 1111 1111 1111 1111 1111 1111 1111
10位轉移它的權利後,你有:
0000 0000 0011 1111 1111 1111 1111 1111
爲了解決這個問題,你必須採取int的適當部分:
short x = (short)((-1 & 0xFFFF) >>> 10);
這樣,(-1 & 0xFFFF)
已經是int了,所以它不包含前導1
's。
這就是我把它縮短的原因,沒有什麼幫助。如何解決? – Mark
@Mark:我更新了答案。 –
嗯,這個工作,但使得代碼比在無符號基元類型中使用c做得更亂。有「更清潔」的解決方案嗎? – Mark