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

Can I add new methods to the String class in Java?

java string

I'd like to add a method AddDefaultNamespace() to the String class in Java so that I can type "myString".AddDefaultNamespace() instead of DEFAULTNAMESPACE + "myString", to obtain something like "

View will appear of second view runs earlier than view will disappear of first view?

ios viewwillappear

i use it for some kind of initialization and it fails in such way. Is it possible to use smth another?