解释为什么x ==〜(~x + 1)+ 1(两个补码并返回!)

时间:2015-11-06 12:38:09

标签: binary proof twos-complement

众所周知,内存中的负数通常表示为两个补码数

from x to ~x + 1

要回来,我们不会做像

这样的明显事情
~([~x + 1] - 1)

但我们做了

~[~x + 1] + 1

有人可以解释为什么它总是有效吗?我想我可以用1位,2位,3位数证明它,然后使用数学归纳法,但它无法帮助我理解它是如何工作的。

谢谢!

2 个答案:

答案 0 :(得分:3)

无论如何,这是一回事。也就是~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

答案 1 :(得分:1)

这是因为如果你增加~x(假设没有溢出)。然后将其转换回x,相对于~x递增,但相对于x递减。同样的事情也适用。假设你的变量x有一个特定的值,每次递增它时,相对于~x你会注意到它递减了。

从程序员的角度来看,这是你基本上见证的。

% 21