三进制数的对称表示法

想出三进制数的对称表示法是从一道数学题开始的:

“最少需要多少个砝码可以在一台天平上称出从1千克到40千克之间的任何整数千克的重量?”
       

先推算出答案是只需要4个砝码,质量为1,3,9,27千克。然后就一直在想为什么这几个数字是3的n次方呢?后来终于想明白了:每个砝码有放左边、不放、放右边三种选项,相当于可以取1,0,-1三种数值,因此问题的本质就是这是一种三进制的计数法。如果只允许砝码在天平的一边放,就会对应为二进制的计数法。

以前学过的三进制数是用0,1,2表示的,用1,0,-1也可以吗?推算一番就会发现果然可以,而且更好用。为了书写方便,用F表示-1,以四位数的三进制数为例,与十进制数的对应关系如下:

三进制数 十进制数 三进制数 十进制数
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个数字。我们看到正数和负数是用统一的规则表示的,而在二进制数中负数需要一种新的规则。三进制代码的一个特点是对称,即相反数的一致性,不存在“无符号数”的概念。本以为这是我独创的一种想法,网上一搜发现这种表示法早已有之,叫做对称三进数表示法。

下面看一下对称三进数的计算规则:

加法
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个三进制位组成,指令集符合三进制逻辑,算术指令允许操作数长为1、2和3字节(三进制),结果长度也扩展到6字节。据说三进制计算机的架构简单、稳定、经济,三进制逻辑电路比二进制逻辑电路速度更快。

Setun ternary computer.

在三进制逻辑学中,符号“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作为另一种情况处理。

作者: Junfeng Liu 发表于 2011-08-26 14:18 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"