Java-屏蔽符号位会导致意外行为

时间:2019-07-11 11:54:04

标签: java bit-manipulation bitwise-operators

我的值如下:

int x = -51232;

Java整数为32位,因此在二进制形式中应为:

10000000000000001100100000100000

由于1为负,因此左侧的符号位设置为x

然后我做手术

x = (x & Integer.MAX_VALUE);

Integer.MAX_VALUE2147483647,二进制形式为:

01111111111111111111111111111111

在左侧为0,因为该值为正。

那为什么x & Integer.MAX_VALUE会产生2147432416AND运算符应仅检索xInteger.MAX_VALUE共有的位,该位应等效于-x(因为它们不共享相同的符号位)。 / p>

这是怎么回事?

2 个答案:

答案 0 :(得分:4)

您的误解是由于缺乏有关Java中如何以二进制表示负整数的知识所致。您应该阅读2的补码。

10000000000000001100100000100000 不是-51232的二进制表示。

11111111111111110011011111100000是。

当您按位执行AND时,您将得到:

11111111111111110011011111100000 (-51232)
01111111111111111111111111111111 (Integer.MAX_VALUE)
--------------------------------
01111111111111110011011111100000 (2147432416)

在51232的二进制表示形式旁边是-51232的二进制表示形式。您可以看到它们的总和是2 32 。对于任何一对int的{​​{1}}和x,2的补码都是如此。

-x

答案 1 :(得分:0)

整数存储在两个补码中:https://en.m.wikipedia.org/wiki/Two%27s_complement

因此,尽管最左边的位表示负数,但它并不是真正的符号位,就像普通表示中的浮点数一样。

这种表示的主要原因是,它使在硬件级别上的加法和减法变得容易。

不应该使用两个补码来表示,-1表示为所有设置为1的位。