被减数大于减数
一个典型的借位减法题目如下:
最右列的 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。