在java中无法生成64位长的值

dha*_*ram 2 java 64-bit

最近我对位操作和算术产生了兴趣.我打算用一个64位长的变量来编写代表棋盘的代码,其中每个位代表一个单元格.

我遇到了如下问题:

public class Chess {

public static void main(String[] args) {
    long v = (1 << 63 ) - 1;
    System.out.println(Long.MAX_VALUE+ " " +v);
    System.out.println(Long.toBinaryString(v));
    System.out.println(Long.bitCount(v));
}

}
Run Code Online (Sandbox Code Playgroud)

以下是上述代码的输出:

9223372036854775807 2147483647
1111111111111111111111111111111
31
Run Code Online (Sandbox Code Playgroud)

这是不正确的.

我期待64位二进制字符串.我正在使用64位Windows操作系统的64位机器.

请帮忙.

rge*_*man 5

你有一个int文字,所以当尝试按位移位时63,只考虑最后5位63- 31.

使用long文字(追加"L")进行位移:

long v = (1L << 63 ) - 1;
Run Code Online (Sandbox Code Playgroud)

JLS,第15.19节,占地面积比特平移的详细信息:

如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.

(强调我的)

这是有道理的 - 一个只有32位int,或2 ^ 5.

也,

如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离.

这也是有道理的 - 在a long或2 ^ 6中有64位.