按位和(&)运算符

时间:2015-10-01 06:31:05

标签: java bit operations

我读到只做符号位& 0x7fffffff屏蔽,不会篡改其他位。

int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);

但是,此代码输出

0

而不是

2147483648

为什么?

2 个答案:

答案 0 :(得分:5)

Java中的负数存储为二进制补码。因此,最小值具有符号位设置而所有其他值未设置。 所以你要做的是:

  10000000000000000000000000000000
& 01111111111111111111111111111111

当你清除符号位时,你会得到零。

  00000000000000000000000000000000

来源:https://en.wikipedia.org/wiki/Two%27s_complement

答案 1 :(得分:1)

删除最重要的位可确保获得非负值。它不能确保结果是积极的。 (0也是非负数。)它也不能确保你得到负值的绝对值。 (你永远不会得到。)

实际上,对于任何负int值,它都会产生以下值:negative_value - Integer.MIN_VALUE

为什么它的行为是这样的,你必须检查两个补码是如何工作的:https://en.wikipedia.org/wiki/Two's_complement