Java Bit Shift Left返回错误的值

时间:2012-04-08 04:38:15

标签: java bit-manipulation long-integer shift

我遇到了Java返回错误值的左位移问题...

取108<<例如60。答案应该是*:

124515522497539473408

Java正在返回此值

-4611686018427387904

这句话:

System.out.println(108L << 60L);

为什么???这两个值都是强制long ...所以我认为没有理由为什么应该截断任何位值。我在这里缺少什么?

*引文:Wolfram Alpha

3 个答案:

答案 0 :(得分:4)

您正在超出long(64位)的长度。 108占用7位,因此108L << 60L需要67位来正确表示它。实际上,由于它是一个有符号的类型,你需要68位来避免它被解释为负数。

答案 1 :(得分:1)

108是7位,因此&lt;&lt; 60是67位数。

答案 2 :(得分:1)

代表108L << 60的数字太大而无法表示为long。所以你正在溢出,并且丢失了高位。

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

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