进行按位运算将位集空间减半的意外行为

时间:2018-12-12 16:09:27

标签: java binary bitset

所以我有最长的时间在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)。

如何在位集中使用剩余的长空间?

1 个答案:

答案 0 :(得分:4)

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

使第一个操作数为long

1L << 31

所以这个:

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

Returns

2147483648=10000000000000000000000000000000