-1

我正在研究按位运算符,直到一元 ~one 的补码与它们一起使用,它们才有意义。谁能向我解释这是如何工作的?

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

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

等等。你可以指点我了解这个吗?

4

3 回答 3

1

当您将它们扩展一点时,它们实际上确实有意义。不过有几点需要注意:

  1. 仅当涉及的两个位都是 1 时,按位与才会产生 1。否则,它会产生 0。1 & 1 = 1、0 & 任何东西 = 0。

  2. 当该位置的任何位为 1 时,按位 OR 产生 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
于 2019-10-22T08:13:55.257 回答
0

~1 = 0- 不,这不对。它等于-2。让我们以一个八位二补码为例。十进制数1有表示法0000 0001。所以~1会有1111 1110哪个是 的两个补码表示-2

于 2019-10-22T08:12:07.177 回答
0

0&~1 = 0~1 = 0因此0&0应该相等0,但它们相等1

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

~0&~1 = -2

~0已设置所有位,所以~0&~1只是~1. 这是-2

~1|~0 = -1

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

于 2019-10-22T08:12:24.173 回答