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位更改为0,反之亦然
  • 设X=X̄+1。如果此加法溢出,则丢弃溢出位。 根据两个补码的定义,X≡ −十,
  • 我看到了一个快速方法,即:

    例如

    B=00010110 D=22

    在从左侧开始第一次“1”计数后翻转所有内容

    -B=11101010 -D=-22


    我无法理解这种方式的证明。

    如果你采用定义,
    -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