所以我有最长的时间在Java中创建“位集”。
我一直认为,如果我使用了很长的时间,我将有64位可以玩。
但是我现在发现这并不那么简单...
我怀疑它必须与溢出和强制转换...
long x = 1<< 30;
return x+ "="+ Long.toBinaryString(x);
渲染器:
1073741824 = 1000000000000000000000000000000
预期。
但是:
long x = 1<< 31;
return x+ "="+ Long.toBinaryString(x);
渲染器:
-2147483648 = 1111111111111111111111111111111000000000000000000000000000000000000
?????
我认为它必须与如何计算二进制移位的等效长值然后将其呈现为long有关。即,将其强制转换为长整数然后进行计算,这是我认为的溢出...
我期望
10000000000000000000000000000000000000
,并且long值是某个负数(无法弄清楚它是什么)。
java中肯定有64位长,就像
Long.toBinaryString(Long.MAX_VALUE);
渲染:111111111111111111111111111111111111111111111111111111111111111(64 1)。
如何在位集中使用剩余的长空间?
答案 0 :(得分:4)
这是因为1<< 31
是一个int
,等于Integer.MIN_VALUE
,然后将其扩展为long
。
使第一个操作数为long
:
1L << 31
所以这个:
long x = 1L << 31;
return x+ "="+ Long.toBinaryString(x);
2147483648=10000000000000000000000000000000