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*:

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

Answers


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.


Need Your Help

IIS6 + MVC3 + Dependency Injection error

.net asp.net-mvc-3 frameworks iis-6 entity

I am developing a web application in MVC, tested in a iis7.5 server and everything works fine. However, when installing on production server I get the following error: