位移操作不会返回预期结果

时间:2012-03-26 22:45:33

标签: java bit-manipulation bit-shift

为什么当我移位 1<<<<<<<<<<<<<<<<<< 63

预期结果是9 223 372 036 854 775 808,使用Wolfram Alpha和我的计算器测试。

我测试过:

System.out.print((long)(1 << (63)));

2 个答案:

答案 0 :(得分:27)

有关行

的重要事项
System.out.print((long)(1 << (63)));

您首先选择(1 << 63),然后然后投出很长时间。结果,你实际上是左移整数,所以长演员没有任何影响。这就是为什么向左移63位给出最小整数而不是最小长度。

但还有另一个更重要的观点。 Java longs总是签名,所以即使是行

System.out.print(1L << 63);

会给出一个负数。在二进制补码下,每当最左边的位为1时,该数字为负数。

实际上,您无法在Java基元类型中表示数字2 63 = 9223372036854775808,因为该数字大于最大长度,long是最大的基本类型。但是,您可以将此数字表示为BigInteger。您甚至可以使用代码

通过左移63来生成它
BigInteger.ONE.shiftLeft(63)

答案 1 :(得分:6)

您正在integer overflow [两次]。

1 << 32 == 1
1 << 31 == -2147483648 [ becuase this is the binary representation in 2's complement for -2147483648]
1 << 63 == 1 << (32 + 31) == (1 << 32) << 31 == 1 << 31 == -2147483648

执行(long)(1 << (63))时,您只会将1 << (63) [-2147483648]的结果投射到long - 并且不会更改其值。