Why is it that:
return 1 | (1 << 32) // returns 0x00000001
but:
return 6 | (1 << 32) // returns 0x00000007
I was expecting the latter to return 0x00000006. What type of bitmask can be OR-ed with the expression to generate 0x00000006 for 6 | (1 << 32)?
Java only uses the last 5 bits of the bit-shift argument when shifting int
s. So 1 << 32
is equivalent to 1 << 0
, or just 1
.
The 1
bit is already set in 1
, so 1 | 1
is 1
. Only the last 8 bits shown for clarity:
0000 0001 (1)
or 0000 0001 (1)
------------
0000 0001 (1)
But the 1
bit is not set in 6
, so 6 | 1
sets the bit and the number becomes 7
. It's working as expected.
0000 0110 (6)
or 0000 0001 (1)
------------
0000 0111 (7)
Addition
In response to the addition to the question:
6
has only 2 bits set (0000 0110
), so any number that you could bitwise-OR with 6
and still have 6
must have all bits clear that are clear in 6
. That leaves just 4 choices, combinations of the set bits of 6
being set or cleared:
Any other int
will set at least one other bit, making the output something other than 6
.
User contributions licensed under CC BY-SA 3.0