如何在mc里打造一个计算器[5] -- 除法器

如果还没看过乘法器的, 推荐去看一下乘法器以便回想一下小学学了什么


回想起小学算特别长的除法时, 会把除数乘1~9的结果写在一盘, 再逐条与当前算到的数字比较, 然后.....嘛, 大家记得除法怎么算就行了
简单看一下, 可以看到除法其实就是在重复 "比较, 减法, 取出被除数下一位" 这个操作, 那么就像其他部件一样可以做一个实现单一操作的部件, 拼在一起就是得到除法器了
我们先来看看每一步操作的输入和输出需要什么
首先输出必定要有商的其中一位, 由于二进制只有0和1, 所以商的其中一位就是1bit, 其次就是输出做完减法后剩下的数字, 这串数字将会输入进下一个部件, 那么部件的输入就有上一个部件做完减法的数字, 并且还需要从被除数里拿出下一位, 由于二进制只有01, 那么需要比较的数字也只有 0*除数,1*除数, 那么输入也应当含有除数*.

弄清楚每一个步骤的输入输出后, 接下来看看里面数据如何流动
以下称从上一个部件输出的数字为A, 而从被除数拿出来的叫a, 除数*为B, 商输出的一位为c, 减法后的余数为C
首先A左移一位为a腾出位置, 得到的新数字 A_ = A<<1 + a, 然后跟着A_与除数比较, 如果A_比除数大, 则商输出c=1, 余数C = A_ - 除数*, 其中A_-除数可以写为A_+(-除数),
*由于除数总是与减法一起计算, 所以在除法开始前需要预先计算(0-除数), 得到的数字再作为后续操作的输入
如果不熟悉正数与负数的转换, 可以去参考之前的加减法器

由加法器的原理简单可知 (溢出整形, 还记得吗), (A_永远小于2*除数, 这部分自己思考一下吧)当计算A_+(-除数)的时候, 如果A_>=除数时, 溢出位为1, 否则为0, 而这个就可以作为我们判断的标准
稍微整理一下思路就得到了实现除法里一步的部件

就像小学除法一样, 拿被除数也是从高位开始拿, 输出商也是从高位开始输出, 当被除数(int)用完后, 剩下的C输出就是除法的余数

就如同大部分部件一样, 除法器可以把重复出现的部分"折叠"起来, 使得体积更小, 但运行速度减慢

一般计算器里的部件原理都不太复杂, 静下心来稍微想想就会懂的了
但是下一篇的BIN转BCD就可能不是了