最近我对位操作和算术产生了兴趣.我打算用一个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位机器.
请帮忙.
你有一个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位.
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |