java - 执行按位运算将位集空间减半时出现意外行为

标签 java binary bitset

所以我在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<< 31int ,等于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/

相关文章:

jquery - 如何限制输入文本框只允许0和1

c++ - 是否有返回字符的 ASCII 值的函数? (C++)

c++ - Bitset 作为函数的返回值

java - 在 Java 中长期被视为 32 位?

java - Apache phoenix 并发查询失败并出现异常

java - 闪烁太多

java - Eclipse 如何知道我没有调用某个对象的某些方法?

java - 设置 "On start"fragment

matlab - 在 Matlab 中对 float 进行位修改

java - 如何在 Java 中以位级精度读写文件