爲什麼說:位移用Java
return 1 | (1 << 32) // returns 0x00000001
但:
return 6 | (1 << 32) // returns 0x00000007
我期待後者返回0x00000006。什麼類型的位掩碼可以用表達式進行或運算來爲6 |生成0x00000006 (1 < < 32)?
爲什麼說:位移用Java
return 1 | (1 << 32) // returns 0x00000001
但:
return 6 | (1 << 32) // returns 0x00000007
我期待後者返回0x00000006。什麼類型的位掩碼可以用表達式進行或運算來爲6 |生成0x00000006 (1 < < 32)?
Java在移位int
s時僅使用位移參數的最後5位。所以1 << 32
相當於1 << 0
,或者只是1
。
1
位已經設置在1
,所以1 | 1
是1
。僅僅是爲了清楚顯示的最後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
該組比特的組合被設置或清除:
任何其他int
將設置至少一個其他位,使得比6
其他輸出的東西。
如果Java只使用位移參數的最後5位,如果參數的值超過5,是否會產生任何警告位? – 2014-10-17 19:14:56
@EricJ。不,但如果你換了一個32位或更大的常量,你的IDE可能會警告你。 – rgettman 2014-10-17 19:16:38
您可以隨時執行按位或6與0得到6. – 2014-10-17 19:23:58