Java Bit Shift Left Returns Wrong Value
I'm having problems with left bit shifts in Java returning incorrect values...
Take 108 << 60 for instance. The answer should be*:
Java is returning this value
for this statement:
System.out.println(108L << 60L);
Why??? Both values are forced longs... so I see no reason why any bit values should be truncated. What am I missing here?
*Citation: Wolfram Alpha
You are shifting beyond the length of a long (64 bits). 108 occupies seven bits, so 108L << 60L requires 67 bits to represent it correctly. Actually, since it's a signed type, you'd need 68 bits to avoid having it interpreted as a negative number.
108 is 7 bits, so << 60 is 67 bits number.
The number that represents 108L << 60 is too large to be represented as a long. So you are getting overflow, and losing the high order bits.
If you want to represent numbers this big (without truncation) the simplest was is to use BigInteger.
Incidentally, the 2nd operand of a shift operator doesn't need to be a long. The actual shift count is calculated by truncating the operand to a number in the range 0 to 63 (for a long shift) - see JLS 15.19.