在上一章中了解了如何实现二进制加法, 加法是始终从两个加数的最右列向左列进位计算的, 而在减法中没有进位, 只有借位.
253 - 176 = 77
上面的式子我们不难算出来, 但习惯性的思维让我们用借位的方式求值. 在不借位的情况下如何实现计算?
借位是很麻烦的事情, 虽然我们能够实现它, 但这意味着额外的开销. 我们将用一个小技巧, 让我们避开借位从而实现减法.
为了避免借位, 我们先从百位最大值999中减去减数, 而非从原来的被减数中减去减数.
999 - 176 = 823
这个方法称为对9求补数. 176对9的补数是823; 反过来说823对9的补数是176. 这样一来, 不管减数是多少, 我们都不需要进行借位操作.
计算出对9的补数后, 将补数与原来的被减数相加:
253 + 823 = 1076
最后将结果加上1, 并减去1000
1076 + 1 - 1000 = 77
用代数思想代入一下, 就能知道为什么这样了, 这里就不再阐述. 我们再看另一个问题.
如果简述大于被减数, 也就是值为负数该怎么计算.
176 - 253 = -77
这与先前有些不同, 我们先用999减去253, 求出9的补数; 然后把9的补数和被减数相加
999 - 253 = 746
746 + 176 = 922
接着我们这里直接减去999, 但会出现借位, 并不符合需求. 将减数和被减数交换, 值取负数即可.
999 - 922 = -77
到此为止, 我们已经解决了十进制不借位做减法运算. 接下来让我们应用到二进制中.