在Java中长期被视为32位?

时间:2018-05-26 07:51:48

标签: java long-integer bit-shift bitset

我正在尝试运行以下代码,

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)。但我认为很长的是64位。

我正试图在集合中设置数字。数字可以在1-60之间。

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

3 个答案:

答案 0 :(得分:4)

您需要使用1L代替1来代表1作为文字long

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

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

Demo

答案 1 :(得分:4)

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

long x = 1 << 39;

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

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

答案 2 :(得分:-1)

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

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

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

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

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