形成二进制数的二进制补码的一种捷径方法是从右边复制位,直到复制一位为止,然后对其余位进行补码(取反)。
什么是不能解释的是为什么这个快捷方式工作,那就是为什么它产生相同的结果,反转所有位并加1。所以,我的问题是,为什么这样做有效?
之所以起作用,是因为将二进制数加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)