~ 一元运算符和按位测试给出否定结果

~ Unary Operator and Bitwise Tests Give Negative Results

我正在研究按位运算符,在使用一元运算符 ~one's complement 之前,它们是有意义的。谁能给我解释一下这是怎么回事?

例如,这些是有意义的,但除此之外的其余计算没有:

1&~0 = 1   (~0 is 1 -> 1&1 = 1)
~0^~0 = 0  (~0 is 1 -> 1^1 = 0)
~1^0 = 1   (~1 is 0 -> 0^1 = 1)
~0&1 = 1   (~0 is 1 -> 1&1 = 1)
~0^~1 = 1  (~0 is 1, ~1 is 0 -> 1^0 = 1)
~1^~1 = 0  (~1 is 0 -> 0^0)

产生的其余结果都是负数(如果未签名则为非常大的数字)或与我所知道的逻辑相矛盾。例如:

0&~1 = 0   (~1 = 0 therefor 0&0 should equal 0 but they equal 1)
~0&~1 = -2
~1|~0 = -1

等你可以指点我了解这方面的任何地方吗?

~1 = 0 - 不,不是。它等于 -2。让我们以八位二进制补码为例。十进制数 1 的表示形式为 0000 0001。所以 ~1 将有 1111 1110 这是 -2.

的两个补码表示

0&~1 = 0 (~1 = 0 therefor 0&0 should equal 0 but they equal 1)

~1 等于 -2。如果翻转二进制补码数的所有位,则将其乘以 -1,然后从结果中减去 1。不管 0 对所有位都有 0,所以 & 的结果无论如何都会是 0

~0&~1 = -2

~0 已设置所有位,因此 ~0&~1 只是 ~1。即 -2.

~1|~0 = -1

~0 设置了所有位,因此 | 的结果是 ~0(= -1),无论它与什么进行“或”运算。

当您将它们扩展得更多时,它们确实有意义。不过有几点需要注意:

  1. 仅当涉及的两个位均为 1 时,按位与产生 1。否则,产生 0。1 & 1 = 1, 0 & anything = 0.

  2. 当该位置的任何位为 1 时,按位或产生 1,只有当该位置的所有位都为 0 时才产生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0.

  3. 有符号数通常以二进制补码的形式完成(尽管处理器不必那样做!)。请记住,使用二进制补码,当最高位位置为 1 时,您反转并加 1 以获得幅度。

假设一个 32 位整数,你会得到这些结果:

 0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1