代码之家  ›  专栏  ›  技术社区  ›  keser

二的补充快速方法

  •  1
  • keser  · 技术社区  · 7 年前

    求二进制数的补码的方法是:

    1. 数字,将所有1位更改为0,反之亦然。
    2. 设X=X+1。如果此加法溢出,则溢出位被丢弃。 根据两个补码的定义,X。

    我看到了一个快速的方法,那就是:

    如。

    B=00010110

    从左侧数到第一个“1”后翻转所有内容。

    -D=-22

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   user555045    7 年前

    如果你接受这个定义, -x = ~x + 1 ,那么如果我们代表 x 作为字符串a10 k a 后面是1,后面是k个零),然后:

    -(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 因为它不能写成a10的形式 k ,等价性仍然成立:因为没有最右边的1,所以没有要补足的部分,所以结果再次为零,这是正确的。

        2
  •  3
  •   ecm    5 年前

    维基百科上的两个补语

    100 “是”1100 0 100

    所以我猜你所说的“从左边数第一个“1”后翻转所有内容”需要修正为“从右边数第一个“1”后翻转所有内容”

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

    推荐文章