定义
三进制码是以3为底数的进制代码,逢三进一、退一还三。三进制码采用0、1、2三个数码,从小数点往左依次是个位、三位、九位、廿七位…,小数点往右依次是三分位、九分位、廿七分位…。
计算机发展的早期,有采用一种偏置的三进制编码——对称三进制,对称三进制采用-1、0、1三个数码。对称三进制码,能比二进制更自然的表示整数,绝对值比较小的整数位数比较少(省略第一非零位前面的零)。
对称三进制码的逻辑通常应用于决策,比如投票有赞成、反对、弃权;交易有买进、卖出、观望,复式记账法体系了对称三进制的思维。SQL数据库系统采用了三值逻辑,是对称三进制的应用。
四则运算普通三进制码的四则运算加法:0+0=0,0+1=1,0+2=2,1+0=1,1+1=2,1+2=10,2+0=2,2+1=10,2+2=11
减法:0-0=0,1-0=1,2-1=1,1-1=0,2-1=1,10-1=2,2-2=0,10-2=1,11-2=2
乘法:0×0=0,0×1=0,0×2=0,1×0=0,1×1=1,1×2=2,2×0=0,2×1=2,2×2=11
除法:0÷1=0,1÷1=1,2÷1=2,1÷2=0.1111...
允许在天平两端放置砝码,问N个砝码如何才能称出最多的整克物体?
答案:1.一个砝码取1克,只能称1克。
2.二个砝码取1克,3克 右盘3,左盘1。称2克 右盘3。称3克 右盘1,3。称4克
3.三个砝码取1克,3克,9克 右盘9,左盘1,3。称5克 右盘9,左盘3。称6克 右盘9,1,左盘3。称7克 右盘9,左盘1。称8克 右盘9。称9克 右盘9,1。称10克 右盘9,3,左盘1。称11克 右盘9,3。称12克 右盘9,3,1。称13克
4.四个砝码取1克,3克,9克,27克。 ............
其中的1,3,9,27,81等都是三进制数的数位。 这道砝码问题是巴协(Bachet)给出的:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?
这里有两种放置砝码的办法:(1)所有砝码只放进天平的一端,(2)砝码可以放进天平的两端。
对于(1),砝码具有两种状态,不放或者放。记不放为0,放为1,这个问题可以使用二进制来解决。二进制的砝码重量设置为1、2、4、8、16、32。在1到1+2+4+8+16+32也就是63之内的任何数量都可以用1、2、4、8、16、32中的某几个数相加得到。所以问题(1)的砝码数是6个,每个砝码的重量设置为1、2、4、8、16、32磅。
对于(2),砝码具有三种状态,不放、放在天平左端、放在天平右端。记不放为0,放左边为1,放右边为-1,这个问题可以使用三进制来解决。在三进制中,砝码的重量设置为1、3、9、27.。在1到1+3+9+27也就是40之内的任何数量都可以用1、3、9、27中的某几个数相加或者相减获得1。
对称三进制码的四则运算加法:T+T=T1,T+0=F,T+1=0,0+T=T,0+0=0,0+1=1,1+T=0,1+0=1,1+1=1T
1+11=1TT,1+111=1TTT,1+1111=1TTTT,1+11111=1TTTTT,1+111111=1TTTTTT
T+TT=T11,T+TTT=T111,T+TTTT=T1111,T+TTTTT=T11111,T+TTTTTT=T111111
连续多个1和1相加,等于将加数1移至被加数连续多个1的前面,并将被加数的连续多个1取反。
TT+TT=TT0+11=T01,T1+T1=T10+1T=TT,1T+1T=1T0+T1=11,11+11=110+TT=10T
同样两个数相加,将被加数左移一位,加上加数的反数即可。需要注意的是,两个数相加,可能位数降低。比如:1TTTT+TTTT=1(五位数加四位数等于一位数)
减法:对称三级制的减法即加法,将加数取反,加到被加数上即可。
乘法:T×T=1,T×0=0,T×1=T,0×T=0,0×0=0,0×1=0,1×T=T,1×0=0,1×1=1
除法:T÷T=1,T÷1=T,0÷T=0,0÷1=0, 1÷T=T,1÷1=1
普通三进制码与对称三进制码的比较1.对称三进制采用-1,0,1作为基本字符,而普通三进制采用0,1,2作为基本字符。
2.对称三进制不需要符号位就能表示负数,而普通三进制需要符号位才能表示负数。
3.对称三进制乘法比较简单,移位、取非、相加就可以完成,便于处理;普通三进制,处理起来比较麻烦。
4.对称三进制在表示自然数的时候,比普通二进制要长。
5.对称三进制在表示0.5〈10〉~1〈10〉之间的数的时候,整数部分为1,不直观;普通三进制没有这种现象。
转换方法整数部分,一般使用长除法,用基数除待转换数或上一步的商,求得余数或补数,直至最后的商为零。将各次余数从后往前排列,即为目标进制下的整数部分。小数部分,一般使用长乘法,用基数乘待转换数或上一步的积,求得整数部分,将正数部分从前往后排列,即为目标进制下的小数部分正负数需要分别处理。
(1)十进制到普通三进制
例如,23562356/3=785余1,785/3=261余2,261/3=87,87/3=29,29/3=9余2,9/3=3,3/3=1,1/3=0余1
以上得知,2356的三进制为10020021
(2)十进制到对称三进制
例如,2356,2356/3=785余1;785/3=262少1,262/3=87余1,87/3=29,29/3=10少1,10/3=3余1,3/3=1,1/3=0余1
以上得知,2356的对称三进制为101T01T1
(3)二进制到对称三进制
3.1 正数
比如0111 1010(十进制122)
01111010/11=101001少1;101001/11=1110少1;1110/11=101少1;101/11=10少1;10/11=1少1;1/11=0余1
01111010的对称3进制为1TTTTT
3.2 负数
比如1011 1010(-70)取原码-1000110
1000110/11=10111余1;10111/11=1000少1;1000/11=11少1;11/11=1;1/11=0余1
得10FF1,逐位取非,得对称三进制为T011T
应用历史现今的计算机都使用“二进制”数字系统,尽管它的计算规则非常简单,但其实“二进制”逻辑并不能完美地表达人类的真实想法。相比之下,“三进制”逻辑更接近人类大脑的思维方式。因为在一般情况下,我们对问题的看法不是只有“真”和“假”两种答案,还有一种“不知道”。在三进制逻辑学中,符号“1”代表“真”;符号“-1”代表“假”;符号“0”代表“不知道”。显然,这种逻辑表达方式更符合计算机在人工智能方面的发展趋势。它为计算机的模糊运算和自主学习提供了可能。只可惜,电子工程师对这种非二进制的研究大都停留在表面或形式上,没有真正深入到实际应用中去。
不过,凡事都有一个例外,三进制计算机并非没有在人类计算机发展史上出现过。其实,早在上世纪50、60年代。一批莫斯科国立大学的研究员就设计了人类历史上第一批三进制计算机“Сетунь”和“Сетунь 70”(“Сетунь”是莫大附近一条流入莫斯科河的小河的名字)。
“Сетунь”小型数字计算机的设计计划由科学院院士С·Л·Соболев在1956年发起。这个计划的目的是为大专院校、科研院所、设计单位和生产车间提供一种价廉物美的计算机。为此,他在莫大计算机中心成立了一个研究小组。该小组最初由9位年轻人(4名副博士、5名学士)组成,都是工程师和程序员。С·Л·Соболев、К·А·Семендяев、М·Р·Шура-Бура和И·С·Березин是这个小组的永久成员。他们经常在一起讨论计算机架构的最优化问题以及如何依靠现有的技术去实现它。他们甚至还设想了一些未来计算机的发展思路。
随着技术的进步,真空管和晶体管等传统的计算机元器件逐渐被淘汰,取而代之的是速度更快、可靠性更好的铁氧体磁芯和半导体二极管。这些电子元器件组成了一个很好的可控电流变压器,这为三进制逻辑电路的实现提供了可能,因为电压存在着三种状态:正电压(“1”)、零电压(“0”)和负电压(“-1”)。三进制逻辑电路非但比二进制逻辑电路速度更快、可靠性更高,而且需要的设备和电能也更少。这些原因促成了三进制计算机“Сетунь”的诞生。
“Сетунь”是一台带有快速乘法器的时序计算机。小型的铁氧体随机存储器(容量为3页,即54字)充当缓存,在主磁鼓存储器中交换页面。这台计算机支持24条指令,其中3条为预留指令,不用。
三进制代码的一个特点是对称,即相反数的一致性,因此它就和二进制代码不同,不存在“无符号数”的概念。这样,三进制计算机的架构也要简单、稳定、经济得多。其指令系统也更便于阅读,而且非常高效。
在这群天才青年日以继夜的开发和研制下,“Сетунь”的样机于1958年12月准备完毕。在头两年测试期,“Сетунь”几乎不需要任何调试就运行得非常顺利,它甚至能执行一些现有的程序。1960年,“Сетунь”开始公共测试。
1960年4月,“Сетунь”就顺利地通过了公测。它在不同的室温下都表现出惊人的可靠性和稳定性。它的生产和维护也比同期其它计算机要容易得多,而且应用面广,因此“Сетунь”被建议立即投入批量生产。
不幸的是,苏联官僚对这个不属于经济计划一部分的“科幻产物”持否定的态度。他们甚至勒令其停产。而此时,对“Сетунь”的订单却如雪片般从各方飞来,包括来自国外的订单,但10到15台的年产量远不足以应付市场需求,更不用说出口了。很快,计划合作生产“Сетунь”的捷克斯洛伐克工厂倒闭了。1965年,“Сетунь”停产了。取而代之的是一种二进制计算机,但价格却贵出2.5倍。
“Сетунь”总共生产了50台(包括样机)。30台被安装在高等院校,其余的则在科研院所和生产车间落户。从加里宁格勒到雅库茨克,从阿什哈巴德到新西伯利亚,全苏都能看到“Сетунь”的身影。各地都对“Сетунь”的反应不错,认为它编程简单(不需要使用汇编语言),支持反向波兰表示法,适用于工程计算、工业控制、计算机教学等各个领域。
有了“Сетунь”的成功经验,研究员们决定不放弃三进制计算机的计划。他们在1970年推出了“Сетунь 70”型计算机。“Сетунь 70”对三进制的特性和概念有了进一步的完善和理解:建立了三进制字节——“tryte”(对应于二进制的“byte”),每个三进制字节由6个三进制位(“trit”,约等于9.5个二进制位“bit”)构成;指令集符合三进制逻辑;算术指令允许更多的操作数长——1、2和3字节(三进制),结果长度也扩展到6字节(三进制)。
对“Сетунь 70”而言,传统计算机的“字”的概念已经不存在了。编程的过程就是对三进制运算和三进制地址的操作。这些基于三进制字节的命令将会通过对虚拟指令的编译而得到。当然,程序员们不必考虑这些——他们只需直接和操作数及参数打交道即可。
“Сетунь 70”是一台双堆栈计算机。其回叫堆栈用来调用子程序。这一简单的改进启发了荷兰计算机科学家艾兹格·W·迪科斯彻,为他日后提出“结构化程序设计”思想打下了基础。
“Сетунь 70”成了莫斯科国立大学三进制计算机的绝唱。由于得不到上级的支持,这个科研项目不得不无限期停顿下来2。