Assembly 两个';快速补充法
查找二进制数的两个补码的方法是:Assembly 两个';快速补充法,assembly,binary,mips,signed,twos-complement,Assembly,Binary,Mips,Signed,Twos Complement,查找二进制数的两个补码的方法是: 设x̄=x的逻辑补码。逻辑补码(也称为“一的补码”)是通过翻转数据中的所有位形成的 数字,将所有1位更改为0,反之亦然 设X=X̄+1。如果此加法溢出,则丢弃溢出位。 根据两个补码的定义,X≡ −十, 我看到了一个快速方法,即: 例如 B=00010110 D=22 在从左侧开始第一次“1”计数后翻转所有内容 -B=11101010 -D=-22 我无法理解这种方式的证明。如果你采用定义,-x=~x+1,那么如果我们将x表示为一个字符串a10k(一个字符串a后跟
我无法理解这种方式的证明。如果你采用定义,
-x=~x+1
,那么如果我们将x
表示为一个字符串a10k(一个字符串a
后跟一个1,后跟k个零),那么:
最后的结果,~a10^k
,意思是“补充左侧,直到(不包括)最右侧的1”
这个证明不适用于
x=0
,因为它不能以A1000的形式书写,所以等价性仍然成立:因为没有最右边的1,所以没有部分可以补足,所以结果再次为零,这是正确的。Two's complement on Wikipedia
手动将二进制数转换为其2的补码的快捷方式是从最低有效位(LSB)开始,复制所有零,从LSB向最高有效位(MSB)移动,直到到达第一个1;然后复制该1,并翻转所有剩余位(如果初始数字采用符号和幅值表示,则将MSB保留为1)。这个快捷方式允许一个人将一个数字转换为其2的补码,而无需先形成其1的补码。例如:在二的补码表示法中,“0011 1100”的否定为“1100 0100”,其中带下划线的[粗体]数字通过复制操作保持不变(而其余数字被翻转)
所以我猜你说的“在第一个“1”从左侧开始计数后翻转所有内容”需要修正为“在第一个“1”从右侧开始计数后翻转所有内容。”
以下是“慢行之道”:
22十进制=00010110二进制->翻转:11101001->加1:11101001+1=11101010=-22十进制
-(a10^k) =
// by definition
~(a10^k) + 1 =
// complement distributes over concatenation
~a01^k + 1 =
// carry through the 1s and set the 0
~a10^k