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

二进制减法

  •  -1
  • Skeen  · 技术社区  · 15 年前

    假设我要减去: 0000万-(-1)

    即:(二补)

          0000 0000
        - 1111 1111
          ---------
        = ???? ????
    

    接下来会发生什么,我的大脑现在真的和我在一起了,以前一切都很好,我想是溢出来的东西把我搞砸了,有人能给我一点许可吗:)?

    5 回复  |  直到 15 年前
        1
  •  6
  •   Ignacio Vazquez-Abrams    15 年前

    取二者在子图中的补码,将其加到分号中。

      0000 0000
    - 1111 1111
    
     ...
    
      0000 0000
    + 0000 0001
    -----------
      0000 0001
    
        2
  •  0
  •   Vladimir    15 年前

    会是(-11..11)。就像小数一样,符号仍然是符号,(0-x)仍然是(-x),除非使用按位运算而不是简单的减法。

        3
  •  0
  •   ssegvic    15 年前

    您可以通过将-1(二进制1111111)的两个补码相加来减去-1(二进制00000001)。因此,以十进制表示,0-(-1)=0+1=1:-)

        4
  •  0
  •   old_timer    15 年前

    硬件的方法是将第二个操作数反转,并执行加法运算,使进位的最低有效位通道为1。所以加法是进位为零的加法,sub是不带操作数和进位集的加法。

    你可以用铅笔和纸的方式,从旁边的数字借钱,但和十进制数字相比,感觉有点傻。如果小数是1000减1,右边的0就变成10,因为这是基数10,那么它旁边的0就必须借出,也就是说它是10,但是右边的0就变成了9,这一直持续到你的第一行是9 9 10,你减去0 0 1,得到999。当基数为20b1000(小数点后八)减去0b001时,同样的情况发生了,右边的0从左边借来,变成2或0b10,因为这是基数2,它旁边的0必须借出,变成0b10,然后再借出右边的1,使其成为1,依此类推,所以你的顶行是1,下行是0,1减去列,得到0b111或7十进制数。

    所以所有的零都减去所有的一,第一次借阅后的第一行是11 1 1 1 1 0b10,最后一行保持为0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,减去列,得到0 0 0 0 0 0 1。

        5
  •  0
  •   Optimus Prime    13 年前

    我的直觉告诉我 0 - (-1) 应该等于 0+1 ,或者只是 1 .

    如果不知道原因,请尝试逐点执行减法:

    0 - 1          = 10 - 1     = 1, setting borrow to 1.
    0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
    etc..
    

    最好不要用手做二进制减法。2s补码的思想是提供一种简单的方法来执行减法,将倒数相加。