2014-10-17 56 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