将 bitset space 减半进行按位运算时的意外行为

Unexpected behaviour when doing bitwise operations halving bitset space

所以我在 java.

中创建了最长的 "bitsets"

我一直认为,如果我使用 long 就可以玩 64 位。

然而我现在发现并没有那么简单...

而且我怀疑它与溢出和转换有关...

long x = 1<< 30;
return x+ "="+ Long.toBinaryString(x);

渲染:

1073741824=1000000000000000000000000000000

预期。

但是:

long x = 1<< 31;
return x+ "="+ Long.toBinaryString(x);

渲染:

-2147483648=1111111111111111111111111111111110000000000000000000000000000000

??????

我假设它必须与如何计算二进制移位的长等效值然后呈现为长。即它被转换为 long 然后计算,我认为这是一个溢出...

我预计

10000000000000000000000000000000

长值是一些负数(不知道它是什么)。

java中的long中肯定有64位...如

Long.toBinaryString(Long.MAX_VALUE);

呈现:1111111111111111111111111111111111111111111111111111111111111(64 个 1)。

如何在我的位集中使用剩余的长space?

这是因为 1<< 31int,等于 Integer.MIN_VALUE,然后您将其扩展为 long

使第一个操作数成为long:

1L << 31

所以这个:

long x = 1L << 31;
return x+ "="+ Long.toBinaryString(x);

Returns:

2147483648=10000000000000000000000000000000