1、除法的本质
除法的本质是减法,也就是一个大的数减去一个小的数,比如:10/2,也就是10-2-2-2-2-2=0,所以商5余0,10/3,也就是10-3-3-3=1,所以商3余1,这也是很常见的方法,但如果引入负数,情况又会有些变化,分成4种总结为2种:
10/2=10-(2*1)-2-2-2-2=0 商5余0,
-10/-2=-10-(-2*1)+2+2+2+2=0 商5余0,
10/-2=10-(-2*-1)-2-2-2-2=0 商-5余0,
-10/2=-10-(2*-1)+2+2+2+2=0 商-5余0,
通过上面示例,可看出双正双负,得的商是正数,而一正一负,得的商是负数,仔细看10/-2及-10/2这两个例子,拿10/-2举例,10-(-2)=12越来越大了,与实际情况不符,所以要乘于-1即,10-(-2*-1)=8与实际情况相符,所以商是负数正确;对于平衡三进制同样适用,被除数与除数相减后变余数,被除数(余数)与除数同种符号,上1反之上T,这样才能保证两者越来越趋向于0,所以最简单粗暴方法就是,用减法来做加法 ,详情请看:二进制如何做除法?及 平衡三进制四则运算 文章。
2、平衡三进制除法器:减法器版
平衡三进制的好处就是对称,但也特别的有特点,比如它的减法器,在平衡三进制加法器中它是正向进位的,而减法器它可以负向进位,你没听错是负向进位,当初的我算也不会算,后面得益于我的初中知识,有公式:被减数 + 取反的要减数= 被减数 - 要减数,即12-6=6相当于12+(-6)=6,负负得正了,这确很方便了,只要被减数加上取反的要减数,就可以得到结果,但其实它的减法表也是可以用,不过太反直觉了,并不建议使用,减法器版除法器,原理如下所示:
可得代码:不想写了
3、平衡三进制除法器:试商版
说实话,其实这才是最常用的,就像10/2=5,没人会10-2-2-2-2-2=0这样算,但对于平衡三进制来说,不理解它的话,这样是最简单的,用十进制的试商方法,刚开始算了很多次,都无从下手,不是结果不对,就是不知道商是+0-,直到我看到了这文章托马斯·福勒的三元计算机,才知道这还真能算,我差点就觉得它压根算了,但它实现是太规整,如下图所示:
它算的是280/5=35,过程很清楚,即216+72+0+8=280,中间结果余数是允许有负的,就像上面的-8,这里有三个点要注意,首先是减法太麻烦了,当商上+时,应是写成(+0++0+)-(+0-000),现在变成了(+0++0+)+(-0+000),这就是相减变成加上它的相反数,所以商为+时,出相反数,商为-时,直接照样写;然后就是对位要齐,若对不齐就会导致算错,这里+0-后面,跟了多少个0,每多1个0,那就要多乘3,可出列表格:
平衡三进制数 | 十进制 |
+0-000 | 216(8*3*3*3) |
+0-00 | 72(8*3*3) |
+0- | 8 |
还有就就是商要怎么上,就是要余数趋于0,规则如下所示:
被除数(余数)与除数互为相反数,商就上- ;
中间结果移动了两位数字,上0先对齐;
当被除数(余数)与除数的符号,都为正数或负数,商就上+;
感觉学会了,下面来用一下吧,比如10/2和4/2的平衡三进制除法:
没想到吧,10/2可以取18这个数,比10都大,但是结果就是正确的,其它都不行,这是怎么想到的,也就是+-后面加0,即+-为2、+-0为6、+-00为18,商是+--,所以结果是18-6-2=10,也就是10-18+6+2=0;同样的,4/2相当于4-6+2=0,商就是+-,6不6,太难算了。