如果计算机也可以用十进位甚至一百进位有没有可能提高性能?二进位中,有小灯泡开和关,如果用不同的亮度不就可以变成十进位了吗?


是的,你的思考很好,计算机本身的理论模型,和采用哪个数学上的进位完全无关,十进位也好,五进位也好,二进位也好,进位在数学上都是等价的,并没有哪个进位拥有其他进位无法实现的计算。

但计算机的实现是个工程问题,需要和真实的物理环境打交道,我们现在是用电路去实现我们的计算机模型,那就需要和物理电路打交道,需要考虑到信号的衰减延迟,电路器件的各种电气特性,什么电磁波干扰电流扰动,也就是会有失真的情况出现,而要最大程度避免衰减,失真对计算机这个完美世界造成破坏,同时要考虑电路的设计,制作成本,就需要最简单化的物理实现方案。

电子计算机确实是可以做成十进位的,就像题主说的像灯泡亮度分成十种亮度那样,但与此同时会出现很多的工程问题,比如对电子器件的精度和稳定性要求很高,电路设计的复杂性提升等等,到头来还不如就用二进位,在成本和质量上最划算。

现实是很残酷的,就算采用了二进位这种最简单最不容易出错的方案,计算机运行都还有很多出错的时候,我们的内存条也要ECC之类的纠正机制,这还是在地球大气层保护之下,上了太空就更恶劣了。


我们先退一步思考这一个问题:当我们在说「计算机使用二进位」的时候,我们到底在说什么?或者,「(现有的主流)计算机」和「二进位」之间到底是什么关系?

首先还是要澄清一个概念:「二进位」这个词严格来说只能用来描述记数法,而计算机中存储的未必是要按照「数」解读的东西;正确来说,应该问「『(现有的主流)计算机』和『二值表示(用两个不同的数值的组合表示信息)』之间到底是什么关系」。不过「二进位」和「二值表示」在英文都是「binary」,翻译过来的时候就已经颇为混淆了,所以下文中我也会继续采用「二进位」这个不严格的说法。

诚然,计算机表示数据的时候是用一堆「有两个状态的东西」表示的,每个「东西」可以对应一位二进位数。然而CPU在对寄存器中的数据进行操作的时候,从来都不是一次只对一位二进位数进行操作的,而是一次操作32个或者64个数位——这就是所谓「32位CPU」「64位CPU」的含义。考虑到人类使用十进位算数的时候总是一位一位地计算,从这个层面上完全可以说这32个到64个二进位位才是对计算机来说的「一位」;而计算机的「一位」越「长」,一般来说可以同时处理的信息也会越多,虽然64位CPU比起32位CPU达不到提速一倍的效果但终究是有提升的。(题外话,计算机的这种「一位」的这个「长度」一般叫做「字长」而不是「位长」——不过这名字也不错,毕竟人类的计算可以说是一位一位地算,也可以说是一个「数字」一个「数字」地算。)

因此,对于题主的第一个问题——

如果计算机也可以用十进位甚至一百进位有没有可能提高性能?

——我的回答是:当然有可能,而且其实已经在这么做了,而且用的不是什么「十进位」「一百进位」这样寒碜的东西,而是4294967296进位,甚至18446744073709551616进位。只不过用的方式和题主在第二个问题里想像的不一样,不是用「同一个量的更多不同等级」表示,而是用「同一种等级分布的更多个量」表示。因此,我可以猜到题主和一部分答主会对此有意见:说是更多进位,其实到了最最底下不还是二进位么?为什么不做成从最最底下就是更多进位的呢?

这样的话我就要反问一句:二进位真的是最最底下吗?真正存在于「最最底下」的其实是电路中电压的高低,是电容上电荷的多少,是磁碟上的磁化程度,光碟上的蚀刻程度,光纤中发光二极体或者「小灯泡」的亮度——而这些全都是(几乎)连续的物理量,并没有什么天然的「只能取两个值」的属性。

关键并不在于信息的存储,而更多地在于对信息的运算操作。从一个有些简化的角度来看,电子计算机其实就是一系列复杂的小开关;计算机进行运算时,这些小开关一边到存储器中存取一些「状态」,一边以复杂的方式互相关联,几个小开关的开闭控制其他小开关的开闭,这些小开关或许又会反过来影响原来的小开关的开闭,以及通往存储器的小开关的开闭。

所谓开关,其实就是大小可以大幅调节的电阻。普通的电器开关靠「拨动开关」的动作,在「金属的低电阻」和「空气的高电阻」之间进行调节;而计算机中的这些「开关」(场效应晶体管)则是根据「输入端(栅极)的电压」,在「自由电荷充足的低电阻」和「自由电荷缺失的高电阻」之间调节。不过,与电器开关不同,在输入电压连续变化时,场效应晶体管的电阻是连续可调的;也就是说,到这一步为止还没有什么「非用二进位不可」的必要性。

但是我们再具体考虑一下。比如,考虑一个最简单的电路,在电源正极 [公式] 和负极 [公式] 之间有两个大小可调的电阻,大小分别为 [公式] (正极侧)和 [公式] (负极侧);两个电阻相接处的电压是我们的输出 [公式] 。那么:

  • 怎么让这个电路输出接近 [公式] 的电压呢?很简单,把 [公式] 选得很小、 [公式] 选得很大,相当于正极侧开关闭合、负极侧开关断开。这是一种输出。
  • 怎么让这个电路输出接近 [公式] 的电压呢?也很简单,反过来把 [公式] 选得很大、 [公式] 选得很小,相当于正极侧开关断开、负极侧开关闭合。现在有两种输出了。
  • 怎么让这个电路输出比如说 [公式] 的电压呢?当然,要选择 [公式] 才行。但是这里有一对矛盾——如果让 [公式] 很小,相当于正负极之间接了一个很小的电阻,根据固定电压下的焦耳热公式 [公式] ,电路很快就会变得很烫,白白消耗了大量电能;如果让 [公式] 很大,那么发热的问题是解决了,但是这个大电阻输出又会很容易被下一级输入端可能不那么大的电阻「短路」掉,从而导致输出电压不稳定,而且还很容易在输出电压高低切换时,由于积累在输出端的电荷无法及时通过大电阻转移掉,而导致处理速度变慢。
  • 其他介于 [公式][公式] 之间的输出电压选择也都有类似的问题,只有两个电阻一小一大数值悬殊的两种输出才能既保证总电阻不太小,以免发热,又保证输出端有足够小的电阻接往电源,以免被「短路」或阻碍快速运算。

因此,对于题主的第二个问题——

二进位中,有小灯泡开和关,如果用不同的亮度不就可以变成十进位了吗?

——我的回答是:电子计算机的结构不适合处理过多的「等级」,不管是亮度等级还是电压等级:计算机的「可变电阻开关」结构——以及计算机电源只有正负两极的现象——决定了计算机必须在很底下的层面就选择二进位,否则就必须在「大量发热」和「不稳定且无法提速」之间二选一。(至于往上一些的层面,前面已经说了可以选择4294967296进位之类了。)

那么,能不能用并非只有正负两极的电源呢?可以自然是可以——实际上前苏联也确实搞过从电源提供三种电压的三进位计算机,名为Сетунь。但是电源线可不比其他的线路,必须要接到计算机中每一个「可变电阻开关」上,而且还不能有太大的内阻;因此,增加一条电源线可能让布线麻烦很多,集成程度越高就更越是如此。(当然,Сетунь的失败也有电源劣势以外的各种因素没错。)

那么,能不能不用「可变电阻开关」结构作为计算机的基础呢?可以自然是可以——实际上也的确有使用其他的电路结构直接计算、再通过电压表读取计算结果的计算机,称为模拟计算机。设计精良的模拟计算机不仅可以算出输入电压之间的四则运算结果,甚至可以直接计算输入电压在时间上的积分。但模拟计算机比起使用「开关」的计算机(数字计算机)又有一个劣势,就是难以抗干扰——比如「开关」计算机中某一处收到了一个 [公式] 的信号,那我们既然已知这个信号本来只可能是 [公式] 或者 [公式] ,就有很大的把握可以说这个信号本来是 [公式] ,只是受到了 [公式] 的干扰;而模拟计算机中同样的信号就只好解释为「大概或许的确是 [公式] ,但其实可能是受到了干扰的 [公式][公式] 的任何一个电压吧」了。此外,模拟计算电路对计算元件(电阻、电容、电感)的精确度也有比数字计算电路更高的要求,而且电容和电感又难以集成化、小型化;模拟计算机的种种劣势决定了数字计算机现在的应用范围已经远远超过了模拟计算机。

综合各种方面的考虑,计算机在很底下的层面选择二进位还是最好使的。

——不过模拟信号也确实并未完全销声匿迹。例如通讯中为了增大带宽,会在同一时刻同时传递多个二进位位的信息;此时不仅可能有多于两种种信号幅度的区别,甚至连信号相位的区别都可能成为携带数据的方式。不过这基本只出现于数据的存储与传递过程中,接下来处理数据(「计算机」嘛,终归要「计算」)还是要回归二进位的。


在 @疑似精神病的基础上增加几句:

从硬体角度看:计算机的信号限制在0-2伏低电压(用0表示)和2-5伏高电压(用1表示)的范围,这些电信号基本运算设备称为门,门有6种基本类型,每种类型执行特定的逻辑函数;更多的门的组合称为电路组合门(电路)来执行更加复杂的任务如算术运算和存储值, 对门和电路的描述的有:

  1. 布尔表达式(变数和函数的值只有0或1),用于表达电路的活动,一开一关
  2. 逻辑框图,电路的图形化表示,每种类型的门有自己专用的符号
  3. 真值表, 所有可能的输入,输出值的表

从这些表示法配合0,1模式才能更好的进行计算。

参考《计算机科学概论》第三部分硬体层(门和电路)再补充两句:
  • 计算机的运算都是二进位
  • 计算机为什么出现这么多进位的原因数据用二进位表示太长
  • C/C++代码中不能直接写二进位, 而是普遍采用八进位或十六进位
  • 为什么不是9进位或20进位,原因就是2,8,16分别是2的次方,这就是三种进位之间可以直接互相转换


因为计算机的物理构成是数字电路, 数字电路的基本构成是逻辑门电路,逻辑门电路的理论基础是布尔逻辑运算,而布尔运算的结果只有两种,二进位每一位正好能表示两种布尔运算的结果。大概就是这样的。如果要用别的那就得从基础进行重新设计,要有一整套理论基础。

因为底层三极体工作在数电状态,只有高电平和低电平两种状态,所以用二进位。

如果要底层做十进位就要让三极体工作在模电状态,然后电平从低到高划10个档。模电计算机确实是有人做的,但不是为了控制电灯亮度这种需求,你可以去搜索一下…


推荐阅读:
相关文章