解释为什么 x == ~(~x + 1) + 1(二进制补码和反向!)
Explain why x == ~(~x + 1) + 1 (two's complement and back!)
众所周知负数在内存中通常表示为这样的补码
from x to ~x + 1
为了返回,我们不会做像
这样明显的事情
~([~x + 1] - 1)
但我们这样做
~[~x + 1] + 1
有人可以解释为什么它总是有效吗?我想我可以用 1 位、2 位、3 位数字证明它,然后使用数学归纳法,但这并不能帮助我理解它到底是如何工作的。
谢谢!
这是因为如果你递增 ~x(假设没有溢出)。然后将其转换回 x,您相对于 ~x 增加了,但相对于 x 减少了。反之亦然。假设你的变量 x 有一个特定的值,每次你增加它时,相对于 ~x 你会注意到它减少。
从程序员的角度来看,这就是您实际看到的内容。
Let short int x = 1 (0x0001)
then ~x = 65534 (0xFFFE)
~x + 1 = 65534 + 1 (0xFFFF)
~(~x+1) = 0 (0x0000)
~(~x+1) + 1 = 0 + 1 (0x0001)
反正都是一样的。即~x + 1 == ~(x - 1)
。但我们暂时把它放在一边。
f(x) = ~x + 1
是它自己的倒数。证明:
~(~x + 1) + 1 =
(definition of subtraction: a - b = ~(~a + b))
x - 1 + 1 =
(you know this step)
x
此外,~x + 1 == ~(x - 1)
。为什么?嗯,
~(x - 1) =
(definition of subtraction: a - b = ~(~a + b))
~(~(~x + 1)) =
(remove double negation)
~x + 1
还有那个(有点不寻常的)减法定义,a - b = ~(~a + b)
?
~(~a + b) =
(use definition of two's complement, ~x = -x - 1)
-(~a + b) - 1 =
(move the 1)
-(~a + b + 1) =
(use definition of two's complement, ~x = -x - 1)
-(-a + b) =
(you know this step)
a - b
众所周知负数在内存中通常表示为这样的补码
from x to ~x + 1
为了返回,我们不会做像
这样明显的事情~([~x + 1] - 1)
但我们这样做
~[~x + 1] + 1
有人可以解释为什么它总是有效吗?我想我可以用 1 位、2 位、3 位数字证明它,然后使用数学归纳法,但这并不能帮助我理解它到底是如何工作的。
谢谢!
这是因为如果你递增 ~x(假设没有溢出)。然后将其转换回 x,您相对于 ~x 增加了,但相对于 x 减少了。反之亦然。假设你的变量 x 有一个特定的值,每次你增加它时,相对于 ~x 你会注意到它减少。
从程序员的角度来看,这就是您实际看到的内容。
Let short int x = 1 (0x0001)
then ~x = 65534 (0xFFFE)
~x + 1 = 65534 + 1 (0xFFFF)
~(~x+1) = 0 (0x0000)
~(~x+1) + 1 = 0 + 1 (0x0001)
反正都是一样的。即~x + 1 == ~(x - 1)
。但我们暂时把它放在一边。
f(x) = ~x + 1
是它自己的倒数。证明:
~(~x + 1) + 1 =
(definition of subtraction: a - b = ~(~a + b))
x - 1 + 1 =
(you know this step)
x
此外,~x + 1 == ~(x - 1)
。为什么?嗯,
~(x - 1) =
(definition of subtraction: a - b = ~(~a + b))
~(~(~x + 1)) =
(remove double negation)
~x + 1
还有那个(有点不寻常的)减法定义,a - b = ~(~a + b)
?
~(~a + b) =
(use definition of two's complement, ~x = -x - 1)
-(~a + b) - 1 =
(move the 1)
-(~a + b + 1) =
(use definition of two's complement, ~x = -x - 1)
-(-a + b) =
(you know this step)
a - b