在 Java 中长期被视为 32 位?

Long getting treated as 32 bits in Java?

我正在尝试运行下面的代码,

public class MyClass {
    public static void main(String args[]) {
        long x = 1 << 39;
        long l = 537150415L;
        l = l | x;

        System.out.println(x);
        System.out.println(l);
    }
}

这输出,

128
537150415

我原以为 x 会是一个很大的数字。 128 看起来像 2^7,也就是 2^(39-32)。但是我以为long是64位的。

我正在尝试在集合中创建一组数字。数字可以在 1-60 之间。

JDoodle link - [https://www.jdoodle.com/online-java-compiler#&togetherjs=uH49U5c4Ej]

您需要使用 1L 而不是 1 来将 1 表示为文字 long:

long x = 1L << 39;
long l = 537150415L;
l = l | x;

System.out.println(x);
System.out.println(l);

Demo

问题是 1 << 39 是一个 32 位表达式。所以

long x = 1 << 39;

首先计算 32 位值,然后将其符号扩展为 64 位值以进行赋值。

如果要创建 64 位掩码,请使用 1L << 39

java 的问题是,int 在 c++ 中是 int32_tlongint64_t,没有无符号类型.

这意味着你必须考虑二进制的补码,所以当设置高位时,你有 -2^64。

如果你只关心一个位集,你不应该直接打印长的。做这样的事情:

for (int i = 0; i < 64; i++) {
 System.out.println((l & (1 << i)) != 0 ? "Bit " + i + " is set" : "Bit " + i + " is not set");
}

编辑:好的,虽然这不是这里的问题,但为了完整起见我会留下答案(因为这些确实是需要考虑的陷阱)