所以我在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
并且 long 值是某个负数(无法弄清楚它是什么)。
java中的long肯定有64位...如
Long.toBinaryString(Long.MAX_VALUE);
渲染:111111111111111111111111111111111111111111111111111111111111111(64 个 1)。
如何使用位集中剩余的长空间?
最佳答案
这是因为1<< 31
是 int
,等于Integer.MIN_VALUE
,然后将其扩大为 long
.
将第一个操作数设为 long
:
1L << 31
所以这个:
long x = 1L << 31;
return x+ "="+ Long.toBinaryString(x);
Returns :
2147483648=10000000000000000000000000000000
关于java - 执行按位运算将位集空间减半时出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747023/