2014-01-12 22 views
0

邏輯移位錯誤這一個正常工作:的Java帶有小數

short x = (short)(0xffff >>> 10); 

即X = 3F(63)

但是,當完成相同的步驟,但用小數表示:

short x = (short)((short)(-1) >>> 10); 

那麼x仍然是FFFF(-1)。

爲什麼發生?

回答

3

因爲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。

+2

這就是我把它縮短的原因,沒有什麼幫助。如何解決? – Mark

+0

@Mark:我更新了答案。 –

+0

嗯,這個工作,但使得代碼比在無符號基元類型中使用c做得更亂。有「更清潔」的解決方案嗎? – Mark