2014-10-17 50 views
0

爲什麼說:位移用Java

return 1 | (1 << 32) // returns 0x00000001 

但:

return 6 | (1 << 32) // returns 0x00000007 

我期待後者返回0x00000006。什麼類型的位掩碼可以用表達式進行或運算來爲6 |生成0x00000006 (1 < < 32)?

+0

您可以隨時執行按位或6與0得到6. – 2014-10-17 19:23:58

回答

5

Java在移位int s時僅使用位移參數的最後5位。所以1 << 32相當於1 << 0,或者只是1

1位已經設置在1,所以1 | 11。僅僅是爲了清楚顯示的最後8位:

0000 0001 (1) 
or 0000 0001 (1) 
------------ 
    0000 0001 (1) 

1位不6設置,所以6 | 1設置位和數量變得7。它按預期工作。

0000 0110 (6) 
or 0000 0001 (1) 
------------ 
    0000 0111 (7) 

加成

在上述追加的問題:

6只有2位設置(0000 0110),所以任何數量,你可以按位或與6仍有6必須清除所有位,清除6。這使得僅4選擇,的6該組比特的組合被設置或清除:

  • 0(0000 0000)
  • 2(0000 0010)
  • 4(0000 0100)
  • 6( 0000 0110)

任何其他int將設置至少一個其他位,使得比6其他輸出的東西。

+0

如果Java只使用位移參數的最後5位,如果參數的值超過5,是否會產生任何警告位? – 2014-10-17 19:14:56

+0

@EricJ。不,但如果你換了一個32位或更大的常量,你的IDE可能會警告你。 – rgettman 2014-10-17 19:16:38