二进制减法

2019/11/29 计算机原理

被减数大于减数

一个典型的借位减法题目如下:

最右列的 3 小于 6,因此从 5 上借 1,再用 13 减去 6 等于 7;由于 5 已经被借 1 了,因此现在的值为 4,4 小于 7,同样需要从 2 借 1,用 14 减去 7 等于 7;最左的一列,2 被借了 1,现在的值为 1,1 减去 1 为 0。因此最终的结果是 77。

下面用一个小技巧来让减法不涉及借位。

进行减法的两个数分别是被减数(minuend)减数(subtrahend)被减数减去减数的结果是

为了避免借位,先用 999 减去减数

从一串 9 (跟减数的位数一致)中减去一个数叫做对 9 求补数。无论减数是多少,计算对 9 的补数都不需要借位。

接着将补数与原来的被减数相加:

最后将结果加 1,并减去 1000。

到此,就得到了结果 77。

这种方法的原理如下:

253 - 176 = 253 - 176 (+ 999 + 1 - 1000) = 999 - 176 + 253 + 1 - 1000

被减数小于减数

以上是被减数大于减数的计算方法,如果被减数小于减数会如何?

如果希望求解这个问题而不使用借位的话,就需要使用跟之前稍微不同的方法。

首先用 999 减去减数 253,计算出对 9 的补数

再将该结果与被减数相加:

这时,可以发现跟之前有点不同,将以上结果加 1 之后值并不大于 1000 的情况,会导致借位。而由于上面已经加了 999,所以这里可以再减去 999:

由于这个结果会是负数,因此将被减数减数交换,用 999 减去 922,并不需要借位,由此得到了期望的结果。

本质上就是:

176 - 253 = 176 - 253 + 999 - 999 = (999 - 253 + 176) - 999 = - (999 - (999 - 253 + 176))

二进制减法

将以上的方法运用到二进制减法中。

被减数大于减数

将以上的十进制数字转化为二进制:

第一步,用 11111111(255) 减去减数

在十进制数减法时,被减数是一串 9 ,称为 9 的补数;在二进制数减法时,被减数是一串 1,称为 1 的补数;另外,在求 1 的补数时,并不需要用到减法,只需要将原来的 1 转为 0,将 0 转为 1 即可。因此,对 1 求补数有时也会称为相反数(negation)反码(inverse)

第二步,将第一步的结果和原来的被减数相加:

第三步,将第二步的结果加 1:

第四步,将第三步的结果减去 100000000(256):

得到的结果正是 77。

被减数小于减数

将以上的十进制数字转化为二进制:

第一步,用 11111111(255) 减去减数

第二步,将第二步结果和原来的被减数相加:

第三步,用第二步的结果减去 11111111(255),但由于这会产生借位,因此转而使用 11111111(255) 减去第二步的结果:

得到的结果是 77,由于上一步交换了被减数减数,因此最终的结果为 -77。

Search

    Table of Contents