按位与 (&) 运算符

Bitwise and (&) operator

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

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

但是,这段代码输出

0

而不是

2147483648

这是为什么?

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

  10000000000000000000000000000000
& 01111111111111111111111111111111

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

  00000000000000000000000000000000

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

删除最高有效位可确保获得非负值。它不能确保结果是肯定的。 (0 也是非负数。)它也不能确保您获得负值的绝对值。 (你永远不会得到。)

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

为了解释为什么它会这样,你必须检查二进制补码是如何工作的:https://en.wikipedia.org/wiki/Two's_complement