为什么说:位移用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