定义

三进制是以3为底数的进制,逢三进一、退一还三。三进制采用0、1、2三个数码,从小数点往左依次是个位、三位、九位、廿七位…小数点往右依次是三分位、九分位、廿七分位…。
计算机发展的早期,有采用一种偏置的三进制——对称三进制,对称三进制采用

-1<T>、0、1

三个数码。对称三进制,能比二进制更自然的表示整数,绝对值比较小的整数位数比较少(省略第一非零位前面的零)。

对称三进制的逻辑通常应用于决策,比如投票有赞成、反对、弃权;交易有买进、卖出、观望,复式记账法体系了对称三进制的思维。SQL数据库系统采用了三值逻辑,是对称三进制的应用。
也有人设计了三进制钞票面额系统。下面有个例子采用对称三进制解决问题。
下面举一例:
三进制数是以下问题的答案:
允许在天平两端放置砝码,问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等都是三进制数的数位。
一些常见的十进制数换三进制表
十进制
三进制
0
0
1
1
2
2
3
10
4
11
5
12
6
20
7
21
8
22
9
100
10
101

表示形式

三进制一般有两种表示形式:
一种是以0,1,2为基本字符的表示形式。例如,365在这种表示形式中的写法是111112。
一种是以-1,0,1为基本字符的表现形式。例如,365在这种表示形式中的写法是1TTTTTT(以T表示-1,负号置于1之上的象形)。这种表示法也被称作对称三进制或平衡三进制。
普通三进制和对称三进制的换算。将普通三进制数中的“2”替换为1T,并进行相应的进位计算即可转换为对称三进制。比如:

112112=110110+1T01T=11T11T+10010=1TT0TTT

。而对称三进制转换为普通三进制则需要进行减法运算。

1TT0TTT=1000000-110111=1000000-111000+112=112112

对称三进制表示整数和浮点数并不需要额外的符号位。最高非零位为1的是正数、为T的是负数。参考二进制,对称三进制一个字节6位(+/-121)。

运算规则

普通三进制的四则运算
加法:

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...
2 .对称三进制的四则运算
加法:

T+T=T1,T+0=T,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
3. 对称三进制的逻辑运算(以T<-1>为正值、1为假值、0为空值)
逻辑或(协调或):

T∨T=T,T∨0=T,T∨1=T,0∨T=T,0∨0=0,0∨1=0,1∨T=T,1∨0=0,1∨1=1
逻辑与(断言与):

T∧T=T,T∧0=0,T∧1=1,0∧T=0,0∧0=0,0∧1=1,1∧T=1,1∧0=1,1∧1=1
逻辑非:

neg T=1,¬0=0,¬1=T
其他逻辑运算
逻辑或(断言或):

T∨T=T,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=T,T∧0=0,T∧1=1,0∧T=0,0∧0=0,0∧1=0,1∧T=1,1∧0=0,1∧1=1

区别

整数的三进制表示法不如二进制那样冗长,但仍然比十进制要长。例如,365在二进制中的写法是101101101(9个数字),在三进制中的写法是111112(6个数字)。
1到27
三进制
1
2
10
11
12
20
21
22
100
对称三进制
1
1T
10
11
1TT
1T0
1T1
10T
100
二进制
1
10
11
100
101
110
111
1000
1001
十进制
1
2
3
4
5
6
7
8
9
三进制
101
102
110
111
112
120
121
122
200
对称三进制
101
11T
110
111
1TTT
1TT0
1TT1
1T0T
1T00
二进制
1010
1011
1100
1101
1110
1111
10000
10001
10010
十进制
10
11
12
13
14
15
16
17
18
三进制
201
202
210
211
212
220
221
222
1000
对称三进制
1T01
1T1T
1T10
1T11
10TT
10T0
10T1
100T
1000
二进制
10011
10100
10101
10110
10111
11000
11001
11010
11011
十进制
19
20
21
22
23
24
25
26
27
3的幂
三进制
1
10
100
1 000
10 000
对称三进制
1
10
100
1 000
10 000
二进制
1
11
1001
1 1011
101 0001
十进制
1
3
9
27
81
3(0)
3(1)
3(2)
3(3)
3(4)
三进制
100 000
1 000 000
10 000 000
100 000 000
1 000 000 000
对称三进制
100 000
1 000 000
10 000 000
100 000 000
1 000 000 000
二进制
1111 0011
10 1101 1001
1000 1000 1011
1 1001 1010 0001
100 1100 1110 0011
十进制
243
729
2 187
6 561
19 683
3(5)
3(6)
3(7)
3(8)
3(9)
在三进制中表示三分之一是很方便的,不像在十进制中,需要用无限小数来表示。但是,二分之一、四分之一之类的分数在三进制中都是无限小数,这是因为2不是3的因子。
小数
三进制
0.111111111111…
0.1
0.020202020202…
0.012101210121…
0.011111111111…
0.010212010212…
对称三进制
0.111111111111…
0.1
0.1T1T1T1T1T…
0.1TT11TT11TT1…
0.011111111111…
0.0110TT0110TT…
二进制
0.1
0.010101010101…
0.01
0.001100110011…
0.00101010101…
0.001001001001…
十进制
0.5
0.333333333333…
0.25
0.2
0.166666666666…
0.142857142857…
分数
frac{1}{2}
frac{1}{3}
frac{1}{4}
frac{1}{5}
frac{1}{6}
frac{1}{7}
三进制
0.010101010101…
0.01
0.002200220022…
0.002110021100…
0.002020202020…
0.002002002002…
对称三进制
0.010101010101…
0.01
0.010T010T010T…
0.01T1101T1100…
0.01T1T1T1T0…
0.01T01T01T01T…
二进制
0.001
0.000111000111…
0.000110011001…
0.000101110100…
0.000101010101…
0.000100111011…
十进制
0.125
0.111111111111…
0.1
0.090909090909…
0.083333333333…
0.076923076923…
分数
frac{1}{8}
frac{1}{9}
frac{1}{10}
frac{1}{11}
frac{1}{12}
frac{1}{13}

比较

1.对称三进制采用-1,0,1作为基本字符,而普通三进制采用0,1,2作为基本字符。
2.对称三进制不需要符号位就能表示负数,而普通三进制需要符号位才能表示负数。
3.对称三进制乘法比较简单,移位、取非、相加就可以完成,便于处理;普通三进制,处理起来比较麻烦。
4.对称三进制在表示自然数的时候,比普通三进制要长。
5.对称三进制在表示

0.5〈10〉sim1〈10〉

之间的数的时候,整数部分为1,不直观;普通三进制没有这种现象。

转换方法

整数部分,一般使用长除法,用基数除待转换数或上一步的商,求得余数或补数,直至最后的商为零。将各次余数从后往前排列,即为目标进制下的整数部分。小数部分,一般使用长乘法,用基数乘待转换数或上一步的积,求得整数部分,将正数部分从前往后排列,即为目标进制下的小数部分正负数需要分别处理。
1十进制到普通三进制
例如,2356
frac{2356}{3}=785余1;frac{785}{3}=262少1,frac{262}{3}=87余1,frac{87}{3}=29,
frac{29}{3}=10少1,frac{10}{3}=3余1,frac{3}{3}=1,frac{1}{3}=0余1
以上得知,2356的三进制为10020021
2十进制到对称三进制
例如,2356,
frac{2356}{3}=785余1;frac{785}{3}=262少1,frac{262}{3}=87余1,frac{87}{3}=29,
frac{29}{3}=10少1,frac{10}{3}=3余1,frac{3}{3}=1,frac{1}{3}=0余1
以上得知,2356的对称三进制为

101T01T1
3二进制到对称三进制
二进制转对称三进制,也是使用辗转相除法。因对称三进制数码可为正可为负,先行确定余数会比较方便。
确定余数时,可以将奇数位之和减去偶数位之和,对3的余数即为余数

[-2即1,2即-1]

3.1 正数
比如

0111 1010(十进制122)
01
10
11
1
10,(余T添1)11÷11=1…(1)
0111 1010的对称3进制为1TT TTT
3.2 负数
比如

1011 1010(-70),取原码T 000TT0(二进制)
T
T
T0
TT,(余0),T T÷11=T…(T)
1011 1010的称三进制为T0 11T

应用历史

现今的计算机都使用“二进制”数字系统,尽管它的计算规则非常简单,但其实“二进制”逻辑并不能完美地表达人类的真实想法。相比之下,“三进制”逻辑更接近人类大脑的思维方式。因为在一般情况下,我们对问题的看法不是只有“真”和“假”两种答案,还有一种“不知道”。在三进制逻辑学中,符号“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”成了莫斯科国立大学三进制计算机的绝唱。由于得不到上级的支持,这个科研项目不得不无限期停顿下来。