为什么这两个补码快捷方式有效?

Bob*_*own 4 twos-complement

形成二进制数的二进制补码的一种捷径方法是从右边复制位,直到复制一位为止,然后对其余位进行补码(取反)。

这说明在SO 在这里,也对维基百科

什么是不能解释的是为什么这个快捷方式工作,那就是为什么它产生相同的结果,反转所有位并加1。所以,我的问题是,为什么这样做有效?

D S*_*ley 6

之所以起作用,是因为将二进制数加1的方法是将所有的1从右翻转到0,直到达到0,再将其翻转到1并停止(实质上是将1加1的溢出)。

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

例如:

 01000100
 10111100  // copy bits until a 1 is reached, then flip the rest
Run Code Online (Sandbox Code Playgroud)

 01000100
 10111011  // invert all bits:
+       1  // add one
 10111100
Run Code Online (Sandbox Code Playgroud)