三进制数的对称表示法
想出三进制数的对称表示法是从一道数学题开始的:
“最少需要多少个砝码可以在一台天平上称出从1千克到40千克之间的任何整数千克的重量?”
先推算出答案是只需要4个砝码,质量为1,3,9,27千克。然后就一直在想为什么这几个数字是3的n次方呢?后来终于想明白了:每个砝码有放左边、不放、放右边三种选项,相当于可以取1,0,-1三种数值,因此问题的本质就是这是一种三进制的计数法。如果只允许砝码在天平的一边放,就会对应为二进制的计数法。
以前学过的三进制数是用0,1,2表示的,用1,0,-1也可以吗?推算一番就会发现果然可以,而且更好用。为了书写方便,用F表示-1,1在个位表示1,进位后10表示3,F在个位表示-1,所以1F就是2。以四位数的三进制数为例,与十进制数的对应关系如下:
三进制数 | 十进制数 | 三进制数 | 十进制数 |
0000 | 0 | ||
0001 | 1 | 000F | -1 |
001F | 2 | 00F1 | -2 |
0010 | 3 | 00F0 | -3 |
0011 | 4 | 00FF | -4 |
01FF | 5 | 0F11 | -5 |
01F0 | 6 | 0F10 | -6 |
01F1 | 7 | 0F1F | -7 |
010F | 8 | 0F01 | -8 |
0100 | 9 | 0F00 | -9 |
0101 | 10 | 0F0F | -10 |
011F | 11 | 0FF1 | -11 |
0110 | 12 | 0FF0 | -12 |
0111 | 13 | 0FFF | -13 |
1FFF | 14 | F111 | -14 |
1FF0 | 15 | F110 | -15 |
1FF1 | 16 | F11F | -16 |
1F0F | 17 | F101 | -17 |
1F00 | 18 | F100 | -18 |
1F01 | 19 | F10F | -19 |
1F1F | 20 | F1F1 | -20 |
1F10 | 21 | F1F0 | -21 |
1F11 | 22 | F1FF | -22 |
10FF | 23 | F011 | -23 |
10F0 | 24 | F010 | -24 |
10F1 | 25 | F01F | -25 |
100F | 26 | F001 | -26 |
1000 | 27 | F000 | -27 |
1001 | 28 | F00F | -28 |
101F | 29 | F0F1 | -29 |
1010 | 30 | F0F0 | -30 |
1011 | 31 | F0FF | -31 |
11FF | 32 | FF11 | -32 |
11F0 | 33 | FF10 | -33 |
11F1 | 34 | FF1F | -34 |
110F | 35 | FF01 | -35 |
1100 | 36 | FF00 | -36 |
1101 | 37 | FF0F | -37 |
111F | 38 | FFF1 | -38 |
1110 | 39 | FFF0 | -39 |
1111 | 40 | FFFF | -40 |
四位数的三进制数总共可以表示3^4=81个数字。我们看到正数和负数是用统一的规则表示的,而在二进制数中负数需要一种新的规则。三进制代码的一个特点是对称,即相反数的一致性,不存在“无符号数”的概念。本以为这是我独创的一种想法,网上一搜发现这种表示法早已有之,叫做对称三进数表示法。
三进制数的小数位也是三进制的,以前面的天平为例,再加入1
—
3,1
—
9,1
—
27千克这三个砝码,就可以把测量精度提高到1
—
27千克。
下面看一下对称三进数的计算规则:
加法
0+0 = 0 | 0+1 = 1 | 0+F = F |
1+0 = 1 | 1+1 = 1F | 1+F = 0 |
F+0 = F | F+1 = 0 | F+F = F1 |
减法
0-0 = 0 | 0-1 = -1 = F | 0-F = -F = 1 |
1-0 = 1 | 1-1 = 0 | 1-F = 1F |
F-0 = F | F-1 = F1 | F-F = 0 |
乘法
0×0 = 0 | 0×1 = 0 | 0×F = 0 |
1×0 = 0 | 1×1 = 1 | 1×F = F |
F×0 = 0 | F×1 = F | F×F = 1 |
除法
0÷1 = 0 | 0÷F = 0 |
1÷1 = 1 | 1÷F = F |
F÷1 = F | F÷F = 1 |
运算规则就是0,1,-1之间的运算,非常简单。根据这个可以设计一个三进制的算盘,上面一排表示+1,下面一排表示-1,珠算口诀也比十进制的算盘简单很多。
用正电压、零电压、负电压分别表示1、0、-1,有可能造出三进制的电子计算机。事实上,前苏联莫斯科国立大学在1956年至1965年设计和制造了三进制计算机“Сетунь”,1970年又推出了“Сетунь 70”,定义了三进制字节——“tryte”,每个三进制字节由6个三进制位组成(取值范围是-364到+364),指令集符合三进制逻辑,算术指令允许操作数长为1、2和3字节(三进制),结果长度也扩展到6字节。据说三进制计算机的架构简单、稳定、经济,三进制逻辑电路比二进制逻辑电路速度更快。高德纳预测未来的光计算机和量子计算机会再次使用三进制计数法,用没有光线表示0,用纵向和横向的线偏光表示1和-1。
在三进制逻辑学中,符号“1”代表“真”;符号“-1”代表“假”;符号“0”代表“不知道”。在一般情况下,我们对问题的看法不是只有“真”和“假”两种答案,还有一种“不知道”,因此三进制逻辑更接近人类大脑的思维方式。显然,这种逻辑表达方式更加适合应用于人工智能。根据哥德尔不完备定理,在相容的公理系统中存在既不能证明也不能否证的命题,也就是说这种类型的命题的逻辑值的确就是不知道。三值逻辑符合更普遍的情况。
对称三进制的逻辑运算规则如下:
或
0∨0 = 0 | 0∨1 = 1 | 0∨F = 0 |
1∨0 = 1 | 1∨1 = 1 | 1∨F = 1 |
F∨0 = 0 | F∨1 = 1 | F∨F = F |
与
0∧0 = 0 | 0∧1 = 0 | 0∧F = F |
1∧0 = 0 | 1∧1 = 1 | 1∧F = F |
F∧0 = F | F∧1 = F | F∧F = F |
非
¬0 = 0 | ¬1 = F | ¬F = 1 |
SQL使用 NULL 来表示在数据库中缺失数据,SQL语句中的逻辑表达式就是三值逻辑,通常TRUE值作为一种情况处理,FALSE和NULL作为另一种情况处理。