1、平衡三进制的加减法
说实话,这个真的好玩,但也有点烧脑的感觉,之前仍不会平衡三进制的除法,又想搞懂,所以又去网上找了一下资料,以“balanced ternary"为关键词找,找到了一篇同为平衡三进制的英文解释文章,找到了四则运算对照表,如下图所示:
但是,如果你想用平衡三进制的加法的思路,去使用平衡的减法表,那你又会怀疑人生了,这是什么鬼,如果还不会加法和乘法请看:有趣的平衡三进制!!!; 在这里先以上图减法表的思路,相同的数相减为0,列出自己的减法表(用左侧数减去顶部数),下面会有用的:
Sub | T1 | T | 0 | 1 | 1T |
---|---|---|---|---|---|
T1 | 0 | T | T1 | T0 | TT |
T | 1 | 0 | T | T1 | T0 |
0 | 1T | 1 | 0 | T | T1 |
1 | 10 | 1T | 1 | 0 | T |
1T | 11 | 10 | 1T | 1 | 0 |
然后以10为被减数,不断减去2,直到为0,也就是:101(十进制10)、10T(十进制8)、1T0(十进制6)、11(十进制4)、1T(十进制2),开始计算如下图所示:
先是101-1T,1-T得到1T,向前进一位保留T,然后0-1-1得到0,最后的1是进位来的,最后1-0得到1,组合成10T(十进制8),减了还进位感觉这很离谱;然后10T-1T,T-T为0,0-1为T,1-0为1,组合成1T0(十进制6);然后1T0-1T,这个就更疑惑了,先是0-T为1,这没问题,然后如果执照T-1得T1,这变成了退一位去了,说实话这我真不会算了,想了半天就将1T看成整体去减1,结果为1才对所以得11;最后就是11-1T,得到0,这样平衡的减法真的不太符合思维,不太建议使用很容易算错的。
后面想了又想,其实减法是转换成加法的,现在的二进制电脑运算也全是加法,比如:12-6=6转成加法就是12+(-6)=6,这里体现出平衡三进制的优势了,要让正数变负数,只要取反(T 变成 1,1 变成 T)就行,也就是从 110(十进制12)-1T0(十进制6) 变成了110(十进制12)+T10(十进制-6),得到运算结果都一样,公式由此得:(被减数 + 取反的要减数)= (被减数 - 要减数)
这才是平衡三进制正确的减法,现在平衡三进制计算器,就可以跟二进制计算机一样运算加减了;有了加减法那平衡三进制的乘除法也就可以有了。
2、平衡三进制的乘除法
为什么说有了加法与减法,乘和除法就有着落了呢?因为乘法的本质是加法,除法的本质是减法,相信大家都有背过九九乘表吧,如下图所示:
首先,加法有对称性(1+3 = 3+1),减法不具有对称性(1-3 != 3-1),所以相加的数可以互换位置不影响结果,相减的数不可互换位置,否则得到错误结果;同理,乘法是加法推出来的,具有对称性,除法是减法推出的,不具有对称性。
接着,给出定义:乘法就是一个数的多少数加后得到的结果。就像是2*3可以理解为:有2个3相加或是有3个2相加,乘法具有对称性(3*12=12*3),乘法继承了加法的对称性;除法就是一个数可以被另一个相减多少次,这个多少次叫商数,不够减的,剩下的数叫余数,比如:10/2=商5余0,10/3=商3余1,这个10刚好被2除尽,被3除剩下1,也就是10-2-2-2-2-2=0 和 10-3-3-3=1 ,可以看出10与5个2相减刚好为0,10与3个3相减剩下1,所以商5余0及商3余1。
同样的,减法不具有对称性,所以相应的除法也不具有对称性,但由于减法可以转换为加法,所以相应的除法也可以转成乘法,若除不尽的就用分数来表示,分数可表示除了无限不循环的小数之外的所有小数,拿刚刚10/3为例,它可以表示为3加上1/3的分数,其中分数1/3为(0.33333......)。
现在就试试平衡三进制的除法了,下面还是用10除2为全例子,10除2就是:10不断的减去2,可以减够5次,剩余0;刚刚说了除法其实可以转成乘法,那就是取反相加,也就是10不断的相加(-2),可以加够5次,剩余0;也就是101(十进制10)/1T(十进制2)最后得到5,因为它相加了5次T1(十进制-2),也就是不断相加,若为0则终止或是 (要除数 )小于 (被除数),就像是10/3,只可以相加3次,不断加-3,第三轮是要除数10变为1,不足以下一轮的相加了,相加就变负了,所以商3余1,也就是3加上1/3的结果。
PS:有关平衡三进制小数部分,用的也是连乘法或是连除法,可以去看平衡三进制小数详解及维基百科,平衡三进制与二进制一样,都是以加法为根本,然后减法转加法,乘法转加法,除法也转加法,对的就是这么神奇,全是加法;如果你不转的话,可以试试,后面你会发现怎么这么难算,或者是又又又算错了,除法与减法全转加法,这样只要乘法对照表及加法对照表,加上取反就可以用平衡三进制的四则运算了。
3、平衡三进制的左移与右移运算
二进制中有三种移位运算:左移(<<)、有符号右移(>>)、无符号右移(>>>); 左移运算相当于乘法运算,即m<<n = m*(2^n),负数在计算机中以补码形式存储,所以负数是对补码进行操作的;有符号右移相当于除法运算,即m>>n = m/(3^n),当正数右移时:左侧补0、当负数右移时:左侧补1,右移过程中被移出去的数会被舍弃,结果就是出现小数部分,小数部分会被舍弃只取商;无符号右移类似于有符号右移,对于正数来说没区别,但对于负数来说操作不同,也就是正数右移及负数右移时:左侧补0,这个运算符用的相对较少,了解就好。
3.1平衡三进制的左移
平衡三进制的左移相当于乘法,对应的也就是m<<n = m*(3^n),它的使用方法也很简单,也就是在后面直接补0即可,对正数及负数的操作都一样,如:1T0--6、1T00--18、1T000--54,也就是6对应的平衡三进制1T0,后面直接补0,就变成了1T00,对应十进制18,再补0就变成54,也可以写成:6<<1=6*(3^1)=18 、6<<2=6*(3^2)=54,这对负数也是管用的,这里也有一个性质,当且仅个位上的数字为零时,就可以被3整除,对正数与负数都生效,可以用来弄的平衡三进制快速乘法器。
3.2平衡三进制的右移
平衡三进制的右移相当于除法,即m>>n = m/(3^n),这个较为麻烦,因为在右移过程中,被移出去的数会被舍弃,这就相当于截位操作,而在平衡三进制中,四舍五入和截位的操作是等效的,你截一下位,相当于四舍五入了。
结合一下上面的结论,要右移就要舍弃最后一位,就产生了截位操作,对于不同的情况有不同处理方式,下面用图片来解释:
从上图,可以看出:当且仅个位上的数字为零时,可以被整除,直接舍弃0不影响结果,正数与负数都可以使用; 当且仅个位上的数字为 T 时,算术右移进行截位操作,直接舍弃T,若为正数是进位的,若为负数是不进位的; 当且仅个位上的数字为 1 时,算术右移进行截位操作,直接舍弃1,若为正数是不进位的,若为负数是进位的(这里的进不进位,表示要不要四舍五入)。
总结一下:舍弃0时,直接去除、舍弃T时,正数进位、舍弃1时,负数进位。举个例子:1T0与T10,直接舍弃0,分别得2与-2的商; 7为1T1,8为10T,然后分别除3,7/3约等于2.333,1T1舍弃1变为1T,没有进位,得到商为2,然后8/3约等于2.6666,10T舍弃T变为10,得到商为3,进位了,对的!自动四舍五入,就是那么神奇,Donald Knuth指出:截断与舍入在平衡三进制中是相同的操作,它们产生完全相同的结果(与其他平衡数字系统共享的属性)。
3.3平衡三进制的舍入
上面讨论了截位操作,低位的截位相当于将这个数四舍五入了,但如果我不想四舍五入,要怎么做,对于没有四舍五入的问题,可将不必要的低位直接归为零,使数字最接近中间的数字,如:11(11T)、12(110)、13(111),将11或13最低位置为零,结果为12,同样的如果将最低位置为T或置为1,产生的效果也不一样:当置为T时,值会向尽量小的取;当置为0时,值会向尽量取中间的值;当置为1时,值会向尽量大的取,合理利用截位与最低位改变,可以很好的控制精度问题。