按位与(&)运算符

3

我看到过这样的说法:执行 & 0x7fffffff 只会屏蔽符号位,不会影响其他位。

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

但是,这段代码输出的是:
0

替代

2147483648

为什么会这样呢?

在你的SOP语句之后打印a - Rustam
1
掩盖符号位并不意味着你会得到-a - Codebender
它打印出“-2147483648”。 - user3824413
打印 ~a 的二进制补码,你会得到你想要的。 - Rustam
@Codebender,这里的 a 是负数,所以屏蔽符号位应该是 -a。如果我错了,请纠正我。 - user3824413
@user3824413,打印一个整数的二进制表示可以使用Integer.toBinaryString(a)函数。这将有助于您理解。 - Codebender
2个回答

5
在Java中,负数以二进制补码的形式存储。因此,最小值的符号位是1,而其他所有值的符号位都是0。 所以你需要做的是:
  10000000000000000000000000000000
& 01111111111111111111111111111111

当你清除符号位时,得到的是零。
  00000000000000000000000000000000

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

二进制补码是一种用于表示有符号整数的方法。它被广泛应用于计算机科学中。在二进制补码中,最高有效位(MSB)代表符号(0表示正数,1表示负数),其余位表示绝对值的二进制形式。这种方法可以将加法和减法统一为同一操作。例如,在8位补码中,127表示为01111111,而-128表示为10000000。


@krzyk int a = -25; System.out.println(a & 0x7fffffff); 输出 2147483623。难道不应该输出 25 吗? - user3824413
@user3824413 不应该,可以看一下我的回答。 - Matthias Wimmer

1

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

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

要了解为什么它会像这样运行的原因,您必须检查两个补码的工作方式:https://en.wikipedia.org/wiki/Two's_complement


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接