按位与 (&) 运算符
Bitwise and (&) operator
我读到 & 0x7fffffff
只屏蔽符号位,不会篡改其他位。
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
但是,这段代码输出
0
而不是
2147483648
这是为什么?
Java 中的负数存储为二进制补码。因此,最小值已设置符号位,而所有其他值均未设置。
所以你要做的是:
10000000000000000000000000000000
& 01111111111111111111111111111111
当您清除符号位时,您得到零。
00000000000000000000000000000000
删除最高有效位可确保获得非负值。它不能确保结果是肯定的。 (0 也是非负数。)它也不能确保您获得负值的绝对值。 (你永远不会得到。)
实际上,对于任何负 int
值,它都会产生以下值:negative_value - Integer.MIN_VALUE
.
为了解释为什么它会这样,你必须检查二进制补码是如何工作的:https://en.wikipedia.org/wiki/Two's_complement
我读到 & 0x7fffffff
只屏蔽符号位,不会篡改其他位。
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
但是,这段代码输出
0
而不是
2147483648
这是为什么?
Java 中的负数存储为二进制补码。因此,最小值已设置符号位,而所有其他值均未设置。 所以你要做的是:
10000000000000000000000000000000
& 01111111111111111111111111111111
当您清除符号位时,您得到零。
00000000000000000000000000000000
删除最高有效位可确保获得非负值。它不能确保结果是肯定的。 (0 也是非负数。)它也不能确保您获得负值的绝对值。 (你永远不会得到。)
实际上,对于任何负 int
值,它都会产生以下值:negative_value - Integer.MIN_VALUE
.
为了解释为什么它会这样,你必须检查二进制补码是如何工作的:https://en.wikipedia.org/wiki/Two's_complement