Reputation: 1889
I'm having problems with left bit shifts in Java returning incorrect values...
Take 108 << 60 for instance. The answer should be*:
124515522497539473408
Java is returning this value
-4611686018427387904
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
Upvotes: 1
Views: 1556
Reputation: 718718
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.
Upvotes: 1
Reputation: 185842
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.
Upvotes: 4