我们经常在各类关于计算机的资料中,看到计算机只认识0和1的字样。这里的0和1其实反映了计算机的另一个特性——二进制。

迄今为止,计算机已经有70多年的历史,从最开始的电子管进化到现在的大规模集成电路,从硬件到操作系统都发生了翻天地覆的变化,但在进制问题上却一直沿用了二进制,那么,二进制到底有什么样的魅力呢?它真的是无可替代的吗?

计算机的二进制算法(从计算机体系结构分析)(1)

计算机为什么不能采用十进制?

1946年,第一台真正意义上的电子计算机ENIAC在美国宾夕法尼亚大学诞生,那时候的计算机比较简陋,也没有操作系统这个概念,整个机器就是由各种门电路板组成的庞然大物,不同的电路板执行不同的程序。而且在当时的计算机中,程序和数据是完全分离的两个概念,数据放在存储器中,而程序作为控制器的一部分,这样的计算机计算效率低,灵活性较差,计算机的运行必须依靠手工去操作、由人来负责硬件的运行,每运行一个不同的程序,就得改动硬件。就像下图所示,几位摩登女郎穿着漂亮的小裙子,进行着各种插线拔线的操作,以便缓解程序工作者们焦虑的心情。所以说人们一开始对计算机的操作,都是基于硬件的,非常的费时费力。

计算机的二进制算法(从计算机体系结构分析)(2)

而且此时的计算机还存在其他问题,由于早期的设计者们习惯使然,依旧采用了人类的思维方式,前文提到的第一台电子计算机ENIAC采用的就是十进制。看起来是很方便,但这种设计的弊病很快便体现了出来:十进制在计算机中如何表示成了大麻烦,计算机做的都是位运算,那该怎么用电路来模拟这十种状态呢?于是人们用电压来控制数字,每隔0.5v就代表一个数字,比方说0.5v代表1,1.0v代表2,但由于当时的机能所限,真空电子管的精度堪忧,这就导致得出的结果往往不准确;最后设计者们也没办法了,干脆用十根电子管代替0-9,这种简单粗暴的方式使让接线变得异常复杂,还造成了严重的硬件浪费,计算机的体积也是相当庞大。

那么,这些问题又是如何解决的呢?

巨人肩膀上的巨人:冯诺依曼

1936年,年仅22岁,数字通信的祖师爷、《信息论》创作者香农基于英国数学家乔治·布尔的关于逻辑数运算的成果,发表了著名的硕士论文《继电器与开关电路的符号分析》,首次将电路和数学联系起来,计算机史上最伟大的发明——继电器由此诞生。

计算机的二进制算法(从计算机体系结构分析)(3)

在同一年,另一位人类巨匠,“AI之父”图灵也发表了一篇影响深远的文章——《论可计算数及其在判定问题上的应用》,图灵以数学的角度出发,从根本上定义了可计算数在二进制及有限指令及状态跳转下的成立。

计算机的二进制算法(从计算机体系结构分析)(4)

随后,现代计算机之父,“天才中的天才”冯诺依曼也站了出来,他吸取了香农,图灵研究的精髓,将计算机科学引入了一个新的高度。

冯诺依曼认为,ENIAC十进制的设计很糟糕,无论是从数学还是物理的角度来看都很别扭,他将高低电平用数字1和0表示,大大降低了模拟电路的实现难度和机器的复杂程度。同时冯诺依曼还将计算机细化为控制,存储,计算,输入输出五个部分,即著名的“冯诺依曼结构”。

冯.诺依曼结构最了不起的创举在于,在该种结构下,不管是程序和数据,通通放在存储器中,这样计算机就可以直接调用存储器中的程序来处理数据了。因为控制器是硬件,数据和程序都是软件,这种设计将软硬件彻底分开,人们再也不用通过硬件来操作软件了,自此人类实现了可编程的计算机。

计算机的二进制算法(从计算机体系结构分析)(5)

可以说正是冯诺依曼的存在,才有了程序员这个职业。

现如今计算机可谓脱胎换骨,处理器的设计也远远超越了冯诺依曼那个年代的水平,简单的冯诺依曼结构和非冯结构也不太适合形容现在的CPU了,但几乎所有的计算机,都无法脱离“存储控制原理 二进制”的设计思路。

历史上,真的有三进制的计算机吗?

相信有不少对计算机感兴趣的朋友都看过这条消息——苏联曾经设计过三进制的计算机。

这个消息是准确的,在二十世纪六十年代,苏联确实搞过这么一款计算机,名叫“Сетунь”,由苏联科学院院士С·Л·Соболев带领着几名研究员共同研发而成。这是人类历史上首台基于三进制的计算机,而且在1960年的时候就投入了市场,反响很不错。

当时的计算机已经发展到第二代,苏联科学家采用了速度更快,可靠性更好的铁氧体磁芯和二极管,然后以此设计出了全新的一种可控电流变压器。由于电压存在着三种状态:正电压(“1”)、零电压(“0”)和负电压(“-1”),三进制恰好和这三种状态对应,从物理层面来讲,三进制比二进制要先进的多。

计算机的二进制算法(从计算机体系结构分析)(6)

但很可惜的是,当时苏联在和美国打冷战,搞军备竞赛,没工夫去理会С·Л·Соболев等人,而且苏联当局对于“Сетунь”的态度也相当敌视,觉得它是“XX主义的丑恶尾巴”,所以虽然项目组收到了来自世界各国源源不断的订单,但他们早就穷的连原料都买不起了。最后迫于无奈,С·Л·Соболев放弃了项目组的心血,关闭了工厂,三进制计算机的传奇也就此落幕。

所以说一项新兴技术的命运,和所在的环境还是有很大关系的,如果这些人在美国,估计又会掀起一场全新的技术革命了。

虽然“Сетунь”的结局是失败的,但它说明了一个非常重要的问题:过去是因为技能限制,所以只能选择二进制的设计。那么伴随着工艺水平的不断提高,计算机可否采用其他更为合理,更快捷的进制呢?

计算机最完美的进制:e进制

按照当下的工艺水平,不论是基于四进制的计算机,还是十进制的计算机,完全可以生产出来,如今电元件都很精确,一块硅板上能集成几十亿根电路,我多划分几个电压,用来表示不同的数字,一点问题都没有。并且从苏联“Сетунь”项目里,我们也能看出,二进制其实并不是最好的选择,它也有缺陷,数位太高,可读性差,非常繁琐。所以说现代计算机都采用二进制,更多的是一种出于成本,以及习惯上的惯性使然。

但实际上,三进制也不是最好的选择,真正最符合计算机逻辑的,其实是另一种鲜为人知的进制——e进制

自然对数e在数学界的地位非比寻常,是人类研究自然科学的重要依仗,并与0,1,圆周率π,虚数i一齐构成了人类史上最伟大的数学公式之一:欧拉公式。后人将其称为“上帝创造的公式”。

计算机的二进制算法(从计算机体系结构分析)(7)

那么,e又是怎么和计算机扯上联系的呢?

在不加任何前提条件的情况下,一个二进制下的2bit所占用的存储空间肯定都会比二进制下4bit的存储要小,相应的2bit数据所能展现的内容也要比4bit少。假如我们放开条件,不再拘泥二进制,那我们能不能用更少的bit来表现更多的信息呢?

这个问题等同于:在不考虑物理实现的情况下,从纯数学角度来讲,能不能将n位数的产出变得最大化?

计算机的二进制算法(从计算机体系结构分析)(8)

这里便涉及到了另一个很常见的问题——“成本-效率”。

先说成本,假设有n位数,采用r进制表示,每一位都可以表示r种状态,这里需要注意,由于数在不同位上的权不同,所以r进制下数的状态共计有r·n个,而不是r个!举个例子,二进制下的3位数001,可以组成001,010,……100共计2x3=6种状态。

再来看效率的概念:假设现在有两个进制,r1和r2,他们都用来表示m个数,呈现状态用s来表示,如果s1<s2,就说明它占用的状态更少,表现的内容更多,r1的效率是高于r2的。举个简单的例子,数字10,在十六进制,八进制和二进制分别为A,12和1010。不难看出,十六进制的效率是最高的,它用一个bit就能体现二进制下4bit才能表达的信息。

所以我们可以据此得到一个数学关系式,即为了表示m个数,当r为多少时,s可以取得最小值?

下面就是纯粹的数学计算了:

m=r^n(1);

s=r·n (2);

(1)式两边同时取自然对数e,由于m是常数,解出n=lnr/lnm,再将n代入(2)式,得到一个关于f:r->s的映射,用函数表示则为,

s=r·(lnr/lnm)(3);

再对(3)式两边r求导,

ds/dr=[(lnr-1)/ln^2r]lnm ;

令m=0,r≈2.71828……,此时s最小,值为e·lnm

其实这就是个高数中的求导问题当r,也就是进制为e时,效率是最高的,如果我们将m无限扩大,分别取10^2,10^3,……,10^10时,从图像中也能看出,曲线的最小值就在e趋近于2.7时达到最小。

计算机的二进制算法(从计算机体系结构分析)(9)

所以说三进制优于二进制,在数学层面也是能得到支持的,因为e更接近3,那为什么不采用e进制呢?因为在物理上无法实现,e是一个无限不循环小数,人类不可能用电元件去模拟出这样一个电路出来,所以e进制只能是理论上的一个存在了。


计算机作为一个集人类智慧大成的产物,其中所蕴含的知识是无法用语言去形容的,一个看上去简单的进制问题,其实是涵盖了计算机体系结构,物理,数学和逻辑多方面因素所影响的最终选择,它凝聚了众多先驱人物的心血和才华,也印证了达芬奇的那句名言——“简单是复杂的终极!”

本文由头条作者爱思考的奥特曼原创作品,未经允许禁止转载。

,