2010-11-16 78 views
-1

说我要减: 0000 0000 - (-1)二进制减法

是:(两者相辅相成)

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

请告诉我要发生的事,我的脑子真的是他妈的*现在和我在一起,它之前完全没问题,我认为它的溢出让我感到困扰,有人可以给予一些清除:)?

+0

语言!!! – 2010-11-16 13:53:57

+0

@精英绅士原谅他,递归很难:) – ruslik 2010-11-16 13:57:50

+0

我说过请至少;) – Skeen 2013-09-05 14:12:45

回答

6

取减数的二进制补码并将其加到被减数中。

0000 0000 
- 1111 1111 

... 

    0000 0000 
+ 0000 0001 
----------- 
    0000 0001 
0

您可以通过加上1的二进制补码(二进制0000 0001)来减去-1(二进制1111 1111)。因此,在十进制中,0 - ( - 1)= 0 + 1 = 1 :-)

+0

0 - 1 == -1;但如果你打算使用按位运算,那么0 - 1 == 1和10 - 1 == 11(二进制)。 – Vladimir 2010-11-16 13:57:20

+0

它真的是第二个补充? -1 = 1111 1111二进制权限,所以你执行补码,加1并再次将两个数字加在一起吧? – 2010-11-16 13:57:45

+0

@Dair:问题是0 - (-1) – 2010-11-16 13:58:21

0

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

0

我的直觉告诉我,0 - (-1)应该等于0+1,或者简单地说1

如果你想知道为什么,试图通过比特执行减法位:

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

,更好的避免了手工做的二进制减法。二进制补码的思想是提供一种通过添加倒数来执行减法的简单方法。

0

硬件确实是它反转第二个操作数,并执行与增加携带的至少显著位通道的方式1。所以一个附加是与进位为零,并添加一个sub是一个加操作数notted和进位集。

你可以做它铅笔和纸的风格,你从旁边的数字借用,但它与十进制数字相比感觉有点愚蠢。用十进制数字表示1000减1,右边的零变为10,因为这是基数10,那么它旁边的0必须借以使它成为10,然后向右借出一个使其成为9,这个继续,直到你的第一行是9 9 10,然后你减去0 0 1并得到999.以基数2 0b1000(十进制8)减去0b0001,同样的事情发生在右边的零上,从左边开始变成2或0b10,因为这是基数2,它旁边的零必须借用以及变成0b10,然后借出一个右边使其成为1等等,所以你的顶行是1 1 0b10,最下面的行是0 0 1减去列,你会得到0b111或7位小数。

所以所有的零减去所有的1,第一行是第一行1 1 1 1 1 1 1 0b10,最下面一行保持为0 0 0 0 0 0 0 0,减去列并得到0 0 0 0 0 0 0 1.