【问题标题】:Explain why x == ~(~x + 1) + 1 (two's complement and back!)解释为什么 x == ~(~x + 1) + 1 (二进制补码并返回!)
【发布时间】:2015-11-06 12:38:08
【问题描述】:

众所周知,内存中的负数通常表示为二进制补码

from x to ~x + 1

为了回来,我们不会做明显的事情,比如

~([~x + 1] - 1)

但我们会这样做

~[~x + 1] + 1

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

谢谢!

【问题讨论】:

标签: binary proof twos-complement


【解决方案1】:

无论如何,这都是一样的。即~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

【讨论】:

  • 那是完美的。我正在努力在那里正确删除括号。我在哪里可以更详细地了解减法的定义?
  • @SolarDia 我不知道,但我也为此添加了一个证明,但现在它可能正在变得有点循环......
  • 谢谢您,先生,它不是圆形的,而且看起来非常一致。二进制补码的定义 -> 减法的定义 -> ~(~x + 1) + 1 == x 不确定这样做是否公平,但我喜欢这样)当我获得足够的声誉时会提出这个评论。
【解决方案2】:

这是因为如果你增加 ~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)

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2019-03-02
    • 2021-01-18
    • 2019-09-18
    相关资源
    最近更新 更多