我正在尝试运行以下代码,
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]
答案 0 :(得分:4)
您需要使用1L
代替1
来代表1作为文字long
:
long x = 1L << 39;
long l = 537150415L;
l = l | x;
System.out.println(x);
System.out.println(l);
答案 1 :(得分:4)
问题是1 << 39
是32位表达式。所以
long x = 1 << 39;
首先计算32位值,然后将符号扩展为64位值以进行赋值。
如果要创建64位掩码,请使用1L << 39
。
答案 2 :(得分:-1)
java的问题是,int
是c ++中的int32_t
而long
是int64_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");
}
编辑:好的,虽然这里不是问题,但为了完整起见,我会留下答案(因为这些确实是需要考虑的陷阱)