在进行除法运算时,也就是多次进行:移位、相减、移位、相减 ... 。
移位,可以是 “被除数左移”,也可以是 “除数右移”。
相减时,如果够减则减,商上 1;如果不够减就不减,商则上 0。
怎么知道够减不够减?
人工计算时,是用肉眼观察出来的。
由计算机计算时,当然就得先减一遍了。
减完之后,发现不够减,这可怎么办? 看看下图吧。
人工计算,大家都会。发现不够减,当然就不减了,把原来的被减数移位即可。
而计算机专家的想法,就复杂了:
减完了,出现了借位 1,这才发现不够减。
然后就必须把除数再加回去,恢复了被减数之后,再移位。
计算机专家的想法,还是有些单纯的,它们以为,减法器一定要输出差。 其实,除法器中的减法电路,在不够减时,完全可以不输出差,而是输出被减数。 这样一来,就没有什么 “恢复余数” 的事了。 而且,在后面再讲什么 “不恢复余数” 的 “加减交替法”,也是白白浪费时间和精力了。 因为,不够减的余数,根本就不存在,你再讲 “恢复”、“不恢复”,显然都没有任何意义!
在上一篇博文 (点击查看) 中,做而论道设计了两种电路。 其中使用 “二选一” 的电路如下所示。
观察图中的红蓝点,可知:被减数 A = 0100,减数 B = 0101,减法器输出借位 C = 1。
借位为 1,就代表不够减。这个借位 (1) 送到 “二选一” 器件 74LS157 后,157 就会把被减数 A = 0100 输出出去。 而此次的差 (1111),就不会出现输出线上。
有了这种电路,就可以用它构成减法器阵列,就可以用来直接做除法了。 这种除法器的工作速度,显然就会比之前设计的循环相减的电路 (点击查看) 要快得多了。
先看一个从网上搜来的阵列示意图。
上图是使用 “加减交替法” 实现除法运算的组成框图。
这么简陋的图,只能说是除法器的框图或示意图,绝不能说这就是除法器!
图中的 CAS 是两用的,既能做减法,又能做加法。 由谁来控制呢?就不用细看了。因为这个示意图,是没有任何用处的。电源都没有接,显然是不能工作的。
上图中的每一行,可做四位数的加或减运算。 图中共有四行,可算出四位商 Q,下面剩余的,就是四位余数 R。
图中的 x6 ~ x1,是 6 位被除数,前面还多一个 0。y3 ~ y1 是 3 位除数,前面也多一个 0。
在数值前面多写的一位 0,是用来当做【正负标志位】的,也可以理解为这是原码的符号位。计算机专家多弄了这么一个位,就浪费了数值的一个位。因此,数值的表示范围,就小了二分之一,很显然,这是得不偿失的。 其实,够减不够减,应该用减法器输出的借位来判别,而不应该由数值的符号来确定。 进位与借位? 好像计算机专家都不怎么理解这件事。
做而论道设计了一个功能与之雷同的【减法阵列除法器】。PROTEUS 仿真图如下所示。
由图中的红蓝点可以看到:被除数 A = 011 1110 = 62,除数 B = 0111 = 7。
除法电路的运算结果是:商数 Q = 1000 = 8,余数 R = 110 = 6。 运算正确。
应该注意到:被除数、除数,以及运算结果,都是无符号数。
图中多数元件的引脚,都是以同名标号进行连接的,如果看不清楚,就看不懂电路的工作原理。 为此,还是看看下面的局部放大图吧。
由图可见,U1 和 U2,构成了第一级减法电路。U3 和 U4,将完成第二级减法运算。
拨动开关产生的数据 A6A5A4A3 送到了减法器 U1 的 A 端,将作为被减数。B3B2B1B0 送到 U1 的 B 端,就成为了减数。 其中 A6 和 B3,都是等于零的。为什么等于零?这就是为了仿照网上搜来的图而弄的。
减法器 U1 输出的差,标号为 D2D1D0,送到了右边的 U2 的一组输入端。 U2 的另一组输入就是被除数 A5A4A3。
减法器 U1 输出的借位 C1,送到了 U2 的数据选择端。 因为 C1 = 0,所以 U2 就选择了 D = 000 作为输出 E2E1E0。 这种情况就是够减了,输出到下一级的就是 A-B 的差。
经过本级的减法运算,将会产生一位商 Q3 = /C1 = 1。
U2 输出的差 E2E1E0 送到了减法器 U3 的 A 端,作为第二级减法的被减数,同时成为被减数的还有 A2。 A2 就相当于左移一位后,在右边落下来一位被除数。
减法器 U3 所需的减数, 仍旧是 B3B2B1B0,由 B 端输入。
U3 立即就会做减法运算,得出差值 F = A-B = 1010,以及借位 C2 = 1。
因为 C2 = 1,所以 U4 就选择了 E1E0A2 = 001 作为输出,标号是 G2G1G0,送到第三次减法的输入端。 这种情况就是不够减,输出到下一级的就是第二级减法器的被减数 A。
经过本级的减法运算,将会产生一位商 Q2 = /C2 = 0。
下面还有两级减法运算,其工作原理与前面的介绍,是完全相同的。就不再赘述了。
本电路经过仿真运行,其运算结果是正确无误的。如果有谁不信,尽可以试试看。
需要注意的是:溢出的问题。
除法的溢出,大家都是知道的,就是:除数不可为零!
其实,还不用除数等于零,如果除数太小,或被除数太大,都是可能溢出的。
针对本电路来说,就要求:被减数的高四位,必须小于四位的除数,否则就会溢出。因为在这种情况下将会出现五位的商,这就超出了本电路的计算范围。此时,本电路的输出,就不正确了。
按照本电路的思路,做而论道还设计了一个 16 位数除以 8 位数的除法电路。 因为电路规模较大,人工输入数据的工作量,就太大了。所以,就用一个 51 单片机为其输入数据 A 和 B,并由该单片机读出该除法电路所输出的商 Q 和余数 R。 在单片机程序中,遍历了各种允许输入的数据,并将该电路的运算结果,与单片机自身的运算结果相比较。 最终发现,全部输入数据的运算结果,都是正确的。
由此可以证明,做而论道的想法,是完全正确且可行的。
由此,也就说明了:必要性与可能性,都是存在的。呵呵
最后,再重申一下做而论道的想法:
讨论计算机所做的除法运算时,不必考虑【不够减时的余数】。
因此,计算机教材中所讲的: “恢复余数法”、不恢复余数的 “加减交替法”,都是毫无意义的想法和做法。
对此,网友如有任何疑问,欢迎留言讨论。
--本文完--