为什么这个二进制补码快捷方式有效?

Why does this two's complement shortcut work?

形成二进制数的补码的一种快捷方法是从右边复制位,直到复制完一位,然后对剩余的位求补(取反)。

SO and also on Wikipedia 上有解释。

没有解释的是为什么这个快捷方式有效,也就是说,为什么它产生与反转所有位并加一相同的结果。所以,我的问题是,为什么这样做有效?

将数字写为 x10k(一些位串后跟 1,然后是 k 个零)。

假设你对它进行补码然后加一,你首先得到 y01k(其中 y 是 x 的补码),然后递增通过尾部的和将零翻转回 y10k.

这与仅对 x 进行补码而保留尾部是一回事。

之所以可行,是因为向二进制数加 1 是通过从右侧将所有 1 翻转为 0 直到达到 0,将其翻转为 1 并停止(本质上是携带 1 加 1 的溢出)来实现的。

所以一种方法只翻转第一个左边的位,而另一种方法翻转 所有 位,然后翻转第一个 1(现在为 0)和它的右边。

例如:

 01000100
 10111100  // copy bits until a 1 is reached, then flip the rest

 01000100
 10111011  // invert all bits:
+       1  // add one
 10111100

所以我找到了一条捷径; Note:This 如果您被允许使用可以进行二进制到十进制转换的计算器,这个技巧就可以奏效。 如果有像这样的 MCQ 问题; Q) 5 的 8 位 2 的补码表示是 .... ,用公式=2^(位数)-个数 在这种情况下,它的 8 位和数字 5 所以; (2^8) - 5 2^8=256 256-5=251 使用计算器将251转换成二进制 然后 = 11111011 二进制。 适用于任何位数。