二进制补码的快速计算方法

3
寻找二进制数的补码方法如下:
  1. 令x̄为x的逻辑补码。逻辑补码(也称为一的补码)是通过翻转数字中的所有位来形成的,将所有的1变为0,所有的0变为1。
  2. 令X = x̄ + 1。如果此加法溢出,则溢出位被丢弃。根据二进制补码的定义,X ≡ −x。

我见过一种快速的方法:

例如:

B = 00010110 D = 22

从左边第一个“1”开始翻转其后的所有位。

-B = 11101010 -D = -22

我不理解这种方法的证明。

2个回答

4

如果我们采用这个定义,-x = ~x + 1,那么如果我们将x表示为一个字符串a10k(一个字符串a后面跟着一个1和k个0),那么:

-(a10^k) =
// by definition
~(a10^k) + 1 =
// complement distributes over concatenation
~a01^k + 1 =
// carry through the 1s and set the 0
~a10^k

最终结果 ~a10^k 的意思是“补充左侧,直到(但不包括)最右边的1”。
对于x = 0,这个证明并不成立,因为它无法写成a10k的形式,但等价性仍然成立:由于没有最右边的1,所以没有需要补充的部分,结果仍然是0,这是正确的。

4

在维基百科上介绍,二进制补码的一种手动快速转换方法是从最低有效位(LSB)开始,复制所有的0,逐位从LSB到最高有效位(MSB)工作,直到遇到第一个1; 然后复制该位上的1,并翻转其余所有位 (如果原始数字使用符号-幅度表示,则将MSB保留为1)。这种方法可以让人们在不先形成一次补码就将数字转换为其二进制补码。例如:在二进制补码中,“0011 1100”取反的结果是“1100 0100”,其中下划线[加粗]的数字通过复制操作保持不变(而剩余的数字都被翻转)。

因此,我认为你所说的“从左边第一个1开始翻转其后的所有位”的方式需要更正为“从右边第一个1开始翻转其后的所有位。”

以下是一种“慢速法”:

22十进制 = 00010110 二进制 -> 翻转: 11101001 -> 加1: 11101001 + 1 = 11101010 = -22 十进制


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接