1

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

4

3 回答 3

4

long您正在移动超出 a (64 位)的长度。108 占用 7 位,所以108L << 60L需要 67 位才能正确表示。实际上,由于它是有符号类型,因此您需要 68 位以避免将其解释为负数。

于 2012-04-08T04:41:23.020 回答
1

108 是 7 位,所以 << 60 是 67 位数字。

于 2012-04-08T04:42:08.733 回答
1

表示的数字108L << 60太大,无法表示为long。所以你会溢出,并丢失高位。

如果你想表示这么大的数字(没有截断),最简单的方法是使用BigInteger.

顺便说一句,移位运算符的第二个操作数不需要是long. 实际移位计数是通过将操作数截断为 0 到 63 范围内的数字(对于long移位)来计算的 - 请参阅JLS 15.19

于 2012-04-08T04:50:08.307 回答