从Setun到平衡三进制:为何更优雅的计算方案败给了二进制?

发布时间:2026/9/12 3:01:57
从Setun到平衡三进制:为何更优雅的计算方案败给了二进制? 做硬件的人基本都有个刻进骨子里的默认前提这世界是二进制的0 和 1高电平和低电平开和关。可如果你愿意把时间往回拨六十年会发现有一台真正跑起来的三进制计算机在莫斯科一所大学里工作了很多年可靠、省电、逻辑还非常优美。没错就是三进制计算机。这题目听起来像考古但它和每个做芯片、写底层软件、做技术选型的人都有关为什么一种从信息论角度看起来“更省资源”的计算方式最后没能走进任何一台主流电脑反而成了教科书里的一个注脚这篇文章我想把这件事拆开聊透。先讲清楚三进制计算机当年到底做到什么程度再比较三进制和二进制在工程实现上的真实差距最后用一个平衡三进制加法器的 Python 模拟带你把“理论上很漂亮”和“工程上不好用”这两个评价亲手验证一遍。看完你就能明白一个技术能不能成为主流很多时候和“谁更优雅”没太大关系反而是生态、成本、零部件供货这些看起来不太“技术”的东西决定了它的命运。1. 三进制计算机是什么以及它离主流曾经有多近1.1 一台真的存在过的三进制计算机Setun很多人的第一反应是三进制计算机大概只存在于某个疯子的草稿纸上。但事实是莫斯科国立大学在 1958 年就造出了一台能稳定运行的样机名字叫 Setun源自大学附近的一条小河。主持这个项目的是计算机科学家尼古拉·布鲁森佐夫他走了一条和当时主流完全不同的路不用双稳态电路而是用铁氧体磁芯的三种磁化状态来存储和表示数字。整台机器采用平衡三进制表示数。这台机器并不是只在实验室里做过一次加法演示。它后来一共生产了大约五十台在不少科研机构和高校里承担过实际计算任务包括科学计算、经济统计这类日常工作。根据当时的测试和使用记录Setun 的运行相当稳定功耗比同级别的二进制机器低指令系统也简洁用户评价并不差。工程上存在的最大问题反而不在 CPU 本身而在于它的外设、纸带、存储介质和配套软件全都和当时已经开始快速标准化的二进制体系脱节。这里有一个容易被忽略的重点Setun 不是没有“赢过”。它在相当长一段时间里证明了自己能用、够用、好用。但它最终没有形成一个可以自我发展的良性循环——没有更多的机构跟进、没有配套的软件工具链、没有稳定量产的供应链。做出来一台机器和把它变成一代主流计算平台中间隔着产业、教育、工具链和标准这些才是真正的鸿沟。1.2 平衡三进制这个“三进制”不是你以为的 0/1/2说到三进制很多人会下意识地想到 0、1、2 三个数字就像十进制多了个“尾巴”。但 Setun 这一类真正意义上的三进制计算机用的是另一种方式平衡三进制三个数字分别是 -1、0、1。你可以把 -1 理解成一个“负单位”它在数位内部就直接表达了负数而不是像二进制那样需要补码或者额外的符号位。这个设计的威力举几个例子就能看出来。十进制里的 5在平衡三进制里可以写成 “ --” 这样一串符号最高位是 表示正数负数的表达就是把所有正负符号交换一下即可不需要单独设计一条“符号位”逻辑。做加法的时候正负符号可以直接统一参与运算进位链不需要为了处理借位单独绕一大圈。做乘法更是舒服乘以 -1 只需要把所有位数取反乘以 3 的幂只需要移位很多在二进制里很繁琐的符号处理步骤会直接消失。平衡三进制还有一个很有意思的性质它天然支持“向最近整数舍入”而不是像二进制补码那样必须做截断。对一个工程师来说这种性质在数值计算里意味着更少的舍入误差。理论上它确实漂亮也不是什么牵强附会的漂亮是一种结构性的简洁。正因如此几十年后依然有人愿意重新讨论它这绝不是单纯的情怀。2. 三进制的理论优势它真的有可能更好2.1 基数经济三进制为什么是效率之王每次聊三进制一定会提到一个概念基数经济。它要回答的问题是用多少个物理单元、多少种状态才能最高效地表示一个范围足够大的数字集合如果假设一个单元可以取 b 种状态每个单元的成本近似与状态数成正比那么为了表示一个给定的数集你需要的总成本大约和 b 乘以 log(b) 成正比。对连续变量求个极小值结果是最优底数是自然常数 e大约等于 2.718。整数里最接近 e 的是 3不是 2。你可以用一个更直白的方式理解这件事。三根二进制位能表达 8 种状态两根三进制位却能表达 9 种状态。反过来看同样表达“大约一千个不同数值”二进制大约需要十位三进制只需要七位出头。换句话说在信息表达层面三进制的每一个“位”能装下的信息量是超过二进制的。但这只是纸上谈兵。基数经济模型里有个隐含假设每一种状态的制造成本是一样的。现实世界不这么友好。一个双态电路只需要判断“高/低”一个三态电路至少要把信号域切成三个区间后面要用的比较器、参考电压、容错空间全都比两态复杂得多。所以理论上的“三进制更省”到了工程里很可能会被“每个三态单元更贵”反超。这一点在下一节会展开。2.2 平衡三进制的好处有一个“负号”带来的连锁反应平衡三进制给运算带来的简化远远不只是少个符号位。比如加法在普通二进制里两数相减需要一个专门的减法器或者用补码绕一圈在平衡三进制里减法就是加上一个符号相反的加数所有数位一视同仁。你在硬件上只需要做同一套加法逻辑不需要额外设计“借位”状态机。乘法和除法也更规整。平衡三进制里每个数字位只有 -1、0、1 三种可能所以乘法器的核心操作只有三种取反、置零、移位。在二进制乘法器里你要处理的是“乘以 0“和“乘以 1”听起来已经很简洁了但平衡三进制把负因子的处理也直接吸收进了算法内部。对于做浮点运算或者科学计算的机器这种数值表达方式能让很多算法少绕很多弯。存储也是一个容易被忽略的优势。当时的磁芯存储能够比较自然地给出三种磁化状态Setun 正是利用了这一点。只要存储介质本身支持三种状态三进制计算机就能在同样的物理器件数量下存下比二进制更多的信息。这也是为什么三进制最初不是某个民科拍脑袋想出来的而是一条在特定工程约束下确实走得通的路线。2.3 三值的逻辑完备性表达力更强逻辑门数量未必更多你可能担心一个问题三值逻辑是不是天生残缺不好做完备的布尔运算实际上三值逻辑系统早就被证明是功能完备的。Setun 的电路里就用了一组被称为“多数逻辑”和“循环移位”的三值算子它们在哲学上等价于二进制里“与非门可以拼出所有逻辑”的那种完备性。也就是说只要给了这组基础门任何你想算的逻辑都能搭出来不会有表达力上的天花板。更有意思的是三值逻辑在一些比较、选择、模拟信号处理场景里逻辑门的数量可能反而更少。举个例子二进制判断一个数是否大于零通常需要比较器或多次位判断在平衡三进制里由于每一位自带符号最高位是正还是负直接说明问题。这种性质可以省掉一部分比较电路。但问题在于这些好处能不能兑现成“芯片更小、更便宜”完全取决于你用什么工艺去实现。三态器件的物理开销如果降不下来逻辑门再少单价也会把优势吃光。3. 二进制赢在工程从晶体管到产业链的三个维度3.1 两态世界电信号天然适应二值逻辑二进制能做主最基本的理由是它和物理器件配合得最自然。晶体管本质上就是一个开关导通或者截止。继电器也是线圈通电或者不通电。我们用一个电压区间代表“有信号”另一个电压区间代表“没信号”中间只要留出足够宽的噪声容限信号传输就会非常稳。这种“天然双态”的匹配关系是从最早的继电器计算机一路继承下来的。更关键的是二进制逻辑和布尔代数严丝合缝。香农在 1937 年证明了继电器电路可以表达布尔代数这件事直接给整个数字电路设计提供了数学地基。你不需要给每个逻辑门设计一个“三值真值表”一切运算都可以拆成与、或、非的组合。制造、验证、形式化分析都有了一套完整方法。这套方法发展了几十年后来的 EDA 工具、综合工具、时序分析工具几乎全是为二值逻辑准备的。做个不太严谨但很形象的类比二态逻辑就像用一个硬币的正反面来传递信息你对“正面”和“反面”的判断几乎不可能出错三态逻辑就像用同一个硬币的“正面、反面、竖起来”来传递信息。竖起来这个状态在技术上很难稳定你还要专门设计一个支架。万一它倒向左边还是右边信息就错了。制造一枚能稳稳定住竖着的硬币比制造一枚只能正反躺着的硬币难得多。3.2 三态的代价阈值、噪声容限和晶体管开销如果你真的在电路里实现一个三态信号第一件事就是把电压区间切出三个窗口比如 0V、1V、2V。接收端的比较器要判断当前电压落在哪个区间这个判断本身就要消耗额外的模拟电路资源。电压域被切得越细两个相邻窗口之间的噪声容限就越小。芯片在工作时存在电源抖动、串扰、开关噪声这些都会让信号在窗口边界附近来回跳一旦触发错误判断就是实打实的计算错误。有人可能会说那我把电压差拉大一点不就好了问题在于供电电压、功耗和工艺尺寸是互相牵制的。现代芯片内部电压已经低到 0.7V 上下别说三态连两态都要靠纠错和余量设计才能保证稳定。你去看看多值逻辑、三态逻辑的研究论文会发现很多工作停留在实验室阶段做出来的芯片要么功耗高要么频率低要么工艺限制太明显。相比之下CMOS 工艺里的与非门、或非门结构简单到了近乎完美在面积、功耗、频率三个指标上全面占优。我在一次用 STM32 的 GPIO 做模拟三态输出实验时对这件事体会特别深。GPIO 本身靠推挽和开漏可以模拟三种“输出状态”但要稳定识别这三种状态必须在外部加精密分压电阻、运放比较器再用 ADC 去采样程序里还要加迟滞判断。每一层额外电路都是噪声和功耗的来源。做出来那一刻我就明白了实验室里能响的三进制电路和能在生产线上跑百万片的三进制芯片是两个世界。3.3 集成度越高二进制的成本优势越大早期计算机还在用电子管和磁芯三进制的“信息密度更高”确实有一定吸引力。可随着半导体工艺进入集成电路时代情况发生了根本性变化。晶体管可以在硅片上以极低的成本大量制造这时一个逻辑门的绝对成本越来越小触发器的面积不再是首要矛盾你真正关心的是能否用一套成熟的工具快速设计、验证、流片。二进制逻辑在这个体系里已经打磨了几十年任何三进制方案想进场都要从零开始重建整个设计流程。晶体管的尺寸越做越小芯片上的逻辑门越来越多二进制的劣势——每个 bit 的信息密度不如 trit——逐渐变得无足轻重。你不够密那就多加几位你位数长那就把数据通路做宽一点。反正晶体管便宜硅片面积可以堆。相比之下三进制逻辑门本身的复杂度会吃掉集成度红利频率上不去功耗压不下来。同样一块芯片面积采用二进制可能塞下一百个逻辑模块采用三进制可能只能塞六十个这个差距会随着工艺微缩越来越大。工艺越成熟路径依赖就越强。设计工具、标准单元库、IP 核、EDA 验证流程全部建立在一套“二值逻辑”的抽象之上。要在现代工艺里做一台三进制 CPU不是改改编码规则就行而是要重写电子设计自动化全链路。这个成本有多恐怖做芯片的人都明白。哪怕三进制的理论优势再大在这个现实面前也不得不低头。4. 生态和路径依赖这才是最残酷的胜负手4.1 软件、外设和数据格式沉默的壁垒一台计算机好不好用不只看 CPU 快不快还要看你能不能把程序写进去、把数据存下来、把结果打印出来。Setun 当年面对的一个很现实的问题就是整个外部世界都在朝二进制靠拢。打孔纸带上的数据格式、打印机接口、外围存储设备的编码方式几乎都是为二进制设计的。你让三进制计算机去对接这些设备要么加一套翻译层要么重新发明全套外设。这种事在今天只会更严重不会更轻松。现代软件栈从编程语言、操作系统、编译器、数据库到网络协议、文件格式、加密算法层层叠叠全部建立在二进制的表示和运算之上。如果现在有人推出了一台三进制电脑哪怕它性能翻倍我也很难想象谁能把现存软件搬到上面去。光是让一个 Python 解释器正确运行就需要重写底层整数的存储、运算符、库函数、调试工具更别说还有庞大的 C 库和操作系统内核。这就是生态壁垒最“阴”的地方它不是由某个人刻意设计的而是无数个小决策日积月累叠加出来的。当初每个二进制外设都比三进制外设更容易买到、更便宜于是大家都去买二进制设备买的人多了生产厂家就更有动力生产二进制设备。这个正反馈一旦转起来三进制在任何一个环节都会遇到“配套跟不上”的阻力。生态一旦形成后来者哪怕技术更优也几乎不可能靠单点产品逆袭。4.2 一个孤立样本撑不起一个生态回顾 Setun 的历史最让人感慨的一点是它几乎是个孤例。布鲁森佐夫团队做出了能跑的机器也有不错的口碑但全世界范围内的研究和跟进者太少。你想为这种机器写编译器找不到同类机器的参考手册你想改进硬件找不到多个供应商竞争你想培训工程师找不到成熟的课程体系。一个人或一个团队再厉害也不可能在短时间内补齐这些外部条件。一个技术路线能不能活下来关键时刻靠的是“有没有一群人愿意陪你一起踩坑”。Binary 生态能起来是因为它在早期有很多实验室、大学、公司同时在做大家互相抄袭、互相借鉴、互相竞争形成了巨大的公共知识池。三进制这边Setun 就像一颗被埋在实验室里的“孤星”虽然亮却没有足够的共振。没有足够多的人参与就没有足够多的试错样本也就不会有快速迭代。这段历史其实给我们一个很实用的提醒当你做技术选型时不要只看“这个技术好不好”还要看“有多少人跟你在同一条船上”。船大一点遇到风浪时还能互相搭把手船太小哪怕方向再正确也可能一个浪头就翻过去了。4.3 换个时间点假如三进制开局二进制也能成为另一个三进制这世上其实不存在“注定成功”的技术路线更多时候只是先发优势被不断放大。假如 20 世纪 50 年代主导计算机产业的是三进制机型外设、软件、教育体系全部围绕三进制标准化那么今天我们学计算机组成原理时可能也会理所当然地觉得三进制才是唯一合理的计数方式。到那时候突然冒出一个二进制方案人们同样会问一个只有 0 和 1 的逻辑系统最多表达两种状态凭什么挑战更高效的三进制这听起来像反事实空想但路径依赖在科技史里极其常见。QWERTY 键盘、VHS 录像带、A4 纸的尺寸都不是纯技术最优的产物却被长期锁定成了标准。计算机的发展被二进制锁定和这些例子本质没有什么不同。一旦生态已经围绕某个方案铺开后发技术想要推翻它需要的不只是“更好”而是“好到足以覆盖全社会的迁移成本”。所以“三进制计算机为什么没有成为主流”这个问题的答案里最扎心的一条是它可能只是因为来得不够早、配套不够多然后在最关键的窗口期里被生态甩开了。技术的成败从来不只由技术本身决定。5. 亲手试一次用 Python 模拟平衡三进制运算器5.1 用代码理解三进制加法理论说再多不如动手跑一遍。下面这个 Python 代码我按平衡三进制的方式实现了一个整数转换和加法器。你可以直接复制到自己电脑上跑感受一下“自带符号的计数系统”到底是怎么工作的。def int_to_balanced(n): 把十进制整数转成平衡三进制数字用 -1, 0, 1 表示。 if n 0: return [0] sign 1 if n 0 else -1 n abs(n) digits [] while n 0: n, r divmod(n, 3) if r 2: n 1 r -1 digits.append(r) if sign -1: digits [-d for d in digits] return digits[::-1] def balanced_to_int(digits): 把平衡三进制转回十进制整数。 val 0 for d in digits: val val * 3 d return val def add_balanced(a, b): 两个平衡三进制数相加返回结果列表。 a a[::-1] b b[::-1] carry 0 result [] for i in range(max(len(a), len(b))): x a[i] if i len(a) else 0 y b[i] if i len(b) else 0 s x y carry if s 2: carry, out 1, -1 elif s 3: carry, out 1, 0 elif s -2: carry, out -1, 1 elif s -3: carry, out -1, 0 else: carry, out 0, s result.append(out) if carry: result.append(carry) return result[::-1] # 示例7 (-5) 2 a int_to_balanced(7) b int_to_balanced(-5) s add_balanced(a, b) print(7 的平衡三进制:, a) print(-5 的平衡三进制:, b) print(和的平衡三进制:, s) print(转为十进制:, balanced_to_int(s))跑完这段代码你会看到负数在平衡三进制里并没有单独的符号位它就是一组带有 -1 的数字。加法过程中进位有时候是 1有时候是 -1这是因为“两位相加大于 1”时你需要向高位进一个正单位而当“两位相加小于 -1”时你要向高位进一个负单位。这种对称的进位规则在二进制补码里是看不到的。从代码里你还能直观感受到平衡三进制的加法规则非常整齐几乎没有特殊情况。数学上它比补码更对称也比原码更自然。可问题在最后这一行转换为了让结果被我们这些用惯十进制的人看懂我还是得先把三进制数翻译回十进制。这就已经暗示了生态转换的成本——不是计算本身难而是我们周围所有工具、习惯和标准都不站在三进制那边。5.2 为什么“硬件三态”没有那么好实现如果你把上面的加法器想在硬件里实现马上就会遇到几个软件里看不见的麻烦。软件里-1、0、1 只是三个整数硬件里你得把这三个符号映射成三个物理信号。最简单的方案是三档电压可三档电压在传输线上的衰减和噪声响应完全不一样接收端要分辨“这到底是 0.9V 还是 1.1V”必须有一组精密的阈值判决电路。即便你绕开电压改用电流、频率、极性等其他物理维度也逃不出“稳定三态”这个魔咒。两态系统只要判断“大于阈值还是小于阈值”一个比较器就能搞定三态系统至少需要两个阈值还要保证三个区间都足够宽、足够稳定。需要的比较器数量、参考电压源数量、校准机制数量几乎是成倍往上翻。这些额外成本摊到每个逻辑门上会让三进制“每 trit 信息密度高”的优势立刻缩水。还有一个在实验室里经常踩的坑是功耗。三态门为了把输出稳定推到三个不同状态往往需要更多的驱动管和偏置电路静态功耗会明显上升。对一台放在实验室里的机器来说多几瓦功耗无所谓对一部手机或者一个服务器集群功耗每高一点都是巨大的代价。现代芯片设计很多时候不是先看算得快不快而是先看功耗墙在哪里。三进制在这条赛道上从一开始就背着个大沙袋。6. 假如三进制活到今天从 AI 量化到后摩尔时代的启示6.1 三进制思想仍在“借壳”回归有意思的是三进制并没有彻底消失它只是换了个马甲在不少现代技术里若隐若现。比如 NAND Flash 的 TLC、QLC用同一个存储单元存 3 个电平、4 个电平甚至更多电平本质就是“多值存储”。存储领域早就想明白了一个单元能装的信息越多大容量越省面积。只不过它的错误率变高需要复杂的纠错和磨损均衡算法来兜底。另一个更贴近三进制的场景是神经网络量化。研究人员提出过 TWNTernary Weight Networks把神经网络的权重直接量化成 -1、0、1 三个值。这样乘法可以大幅简化因为乘以 -1、0、1 几乎不需要真正的乘法器。你去看很多端侧推理加速器里面大量操作就是在用“三值权重”换取速度和功耗。这个思路和平衡三进制当年追求简洁运算的初衷如出一辙。在后摩尔时代当制程微缩越来越难大家开始重新审视新的计算范式存内计算、模拟计算、多值逻辑、概率计算。三进制这种另类表示方式作为备选方案时不时会被翻出来。虽然它几乎不可能取代二进制去重建整个生态但它的某些局部思想完全可以被吸收进现代硬件设计里。这就是“逝去的机遇”留给我们的真正遗产一个被主流抛弃的方案并不意味着里面没有金子。6.2 常见误区与我的几条实操心得关于三进制计算机网上流传着一个特别普遍的说法三进制失败是因为当时做不出稳定的三态电路。这个说法并不准确。从 Setun 的实践来看三态电路在那个年代是做得出来的而且稳定性并不差。真正压垮它的不是“造不出来”而是“造出来之后没有足够的生态让它持续迭代”。如果你把失败完全归因于硬件难度就会忽略路径依赖和产业配套这些真正的胜负手。还有一个误区是把“信息密度高”直接等同于“整体更好”。我在前面已经算过这笔账密度高是三进制的优势但三态单元的成本更高综合下来未必划算。做技术选型时不能只看单个指标更要看整个系统在约束条件下的综合表现。软件能跑、外设能接、供应链能供、工程师能招这些都比“字面上更优雅”重要得多。如果只让我提炼三条实操心得我会这么说。第一在评估一项新技术时先列出“如果不改变现有生态我要额外付出什么代价”这个代价往往比新技术带来的收益更现实。第二对“理论上最优”要保持敬畏但更要保持警惕因为真实世界充满了无数理论上没写进公式的摩擦。第三多值表示、带符号数位、对称编码这些“非主流”思路虽然没成为主流水线但在特定场景里仍然值得认真研究。我自己在调试一些数值算法时就因为借鉴了平衡三进制的“舍入到最近整数”思想省掉了不少误差补偿代码。回头再看三进制计算机这段历史最让我感慨的是它其实离“被记住”只有一步之遥。它不缺乏创意也不缺乏工程验证缺的是一整条愿意陪着它成长的生态链。个人做技术决策时也一样真正决定成败的往往不是你想得多完美而是有多少人能跟上你的脚步有多少工具愿意为你的方案铺路。这个道理放到今天依然适用。