为什么会这样:
return 1 | (1 << 32) // returns 0x00000001
但:
return 6 | (1 << 32) // returns 0x00000007
我期待后者返回0x00000006。可以使用表达式对哪种类型的位掩码进行OR运算,以便为6 |生成0x00000006 (1 <&lt; 32)?
答案 0 :(得分:5)
Java仅在移位int
时使用位移参数的最后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
。