~ 一元运算符和按位测试给出否定结果
~ 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。否则,产生 0。1 & 1 = 1, 0 & anything = 0.
当该位置的任何位为 1 时,按位或产生 1,只有当该位置的所有位都为 0 时才产生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0.
有符号数通常以二进制补码的形式完成(尽管处理器不必那样做!)。请记住,使用二进制补码,当最高位位置为 1 时,您反转并加 1 以获得幅度。
假设一个 32 位整数,你会得到这些结果:
0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1
我正在研究按位运算符,在使用一元运算符 ~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
therefor0&0
should equal0
but they equal1
)
~1
等于 -2
。如果翻转二进制补码数的所有位,则将其乘以 -1
,然后从结果中减去 1
。不管 0
对所有位都有 0
,所以 &
的结果无论如何都会是 0
。
~0&~1 = -2
~0
已设置所有位,因此 ~0&~1
只是 ~1
。即 -2
.
~1|~0 = -1
~0
设置了所有位,因此 |
的结果是 ~0
(= -1
),无论它与什么进行“或”运算。
当您将它们扩展得更多时,它们确实有意义。不过有几点需要注意:
仅当涉及的两个位均为 1 时,按位与产生 1。否则,产生 0。1 & 1 = 1, 0 & anything = 0.
当该位置的任何位为 1 时,按位或产生 1,只有当该位置的所有位都为 0 时才产生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0.
有符号数通常以二进制补码的形式完成(尽管处理器不必那样做!)。请记住,使用二进制补码,当最高位位置为 1 时,您反转并加 1 以获得幅度。
假设一个 32 位整数,你会得到这些结果:
0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1