编码,是用于表示和传递信息的方式。例如,摩尔斯电码,用点和划来表示信息,用于电报机通信。布莱叶盲文,使用凸出和不凸出来表示信息,阅读者通过触摸来理解信息。
对于计算机,底层是使用0和1来表示信息,通过多个0和1的组合,可以表示几乎无穷无尽的信息。
那么,在计算机的最底层,究竟是如何实现对数据的存储,又是如何实现对数据的运算呢?
加法是算法计算中最基础的运算。今天,我们就来看看如何实现一个最基本的二进制加法器。
摩尔斯电码
摩尔斯电码(英语:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人艾尔菲德·维尔与萨缪尔·摩尔斯在1836年发明。
有两种“符号”用来表示字符:点(·)和划(-),或叫“滴”(dit)和“答”(dah)。
划一般是三个点的长度;点划之间的间隔是一个点的长度;字符之间的间隔是三个点的长度;单词之间的间隔是七个点的长度。
用二叉树表示的国际摩尔斯电码。图中每一分叉的左支为点(·),右支为划(-),直到到达所需要表示的字符为止。
(想到什么了?霍夫曼编码)
参考:维基百科
布莱叶盲文
路易·布莱叶(法语:Louis Braille)是世界通用的盲人及视觉障碍者使用的文字系统布莱叶点字法的发明者。布莱叶点字法是一种通过阅读者用手指触摸由突起的点组成的文字进行阅读的方法。
盲文的基本单位是长方形的盲符,有位置固定的六个点,每个点可以凸出或不凸出,形成64种可能。六个点的分布是左右两列,上中下三层。如图所示,左列自上而下称为1、2、3点,右列自上而下称为4、5、6点。
26个拉丁字母表示法如下:
阿拉伯数字表示法有布莱叶和安托万两种。布莱叶式比较常用,英语盲文、汉语盲文等众多盲文都使用这种形式;安托万式主要用于法语盲文。
参考:维基百科
电流产生的原因
我们知道,原子由原子核和电子组成。原子核由质子和中子组成,而电子则围绕着原子核旋转,犹如行星围绕太阳旋转一样。
质子和电子都具有带电荷(charge)的性质。质子有一个正电荷(+),电子有一个负电荷(-)。中子是中性的,不带电荷。
当质子数与电子数相同时,这个原子就是电中性的;否则,就是带有正电荷或者负电荷的离子。
一个原子中,电子的数目一般情况下与质子数目相同。但是在某些情况下,电子可能从原子脱离。这就是电流产生的原因。
例如电池内部会发生化学反应,分裂或合成新分子。化学反应能够使多余的电子聚集到负极,而正极则变得急需额外的电子。由于异性电荷相吸引,同性电荷相斥。于是,化学能就被转化成了电能。电荷的移动,称为电流。
线路越长,电阻越大。电阻越大,线路中的电流就越少。电流越少,灯泡就越暗。
电报机与继电器
在未发明电报以前,长途通讯的主要方法包括有:驿送、信鸽、信狗以及烽烟等。驿送是由专门负责的人员,乘坐马匹或其他交通工具,接力将书信送到目的地。
电报是通信业务的一种,在19世纪初发明,是最早使用电进行通信的方法。
电报机的发明,标志着现代通信的开始。人们第一次能够在视线或者听力之外的距离范围进行实时交流了。
继电器(Relay),也称电驿,是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
继电器是一个意义非凡的设备。当然,它是一个开关,但是这个开关的闭合和断开不是由人来操纵的,而是由电流控制的。
继电器工作原理
开关断开状态:
左侧开关(Schalter)闭合后,线圈产生电流,磁铁产生磁性。磁铁将金属条(Anker)吸附下来,使右侧的开关闭合,形成回路,于是电灯就亮了。
开关
使用2个开关,按以下方式连接,称之为串联。
仅当两个开关同时闭合时,灯泡才会亮。
一个开关有两个状态,我们用0表示断开,1表示闭合。灯泡也有两个状态,同样用0表示不亮,1表示灯泡亮。
那么有如下关系:
开关1 | 开关2 | 灯泡 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
两个开关串联,相当于布尔代数中的AND运算。
AND | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
改变一下2个开关的连接方式,如下图所示,这种连接方式称之为并联。
只要有一个开关闭合,灯泡就会亮。
开关1 | 开关2 | 灯泡 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
两个开关关联,相当于布尔代数中的OR运算。
OR | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
逻辑门
在计算机术语中,开关是一种输入设备,输入是控制电路如何工作的信息。
继电器像开关一样,可以串联或并联在电路中执行简单的逻辑任务。这种继电器的组合叫做逻辑门(logic gates)。
继电器优于开关之处在于,继电器可以被其他继电器所控制,而不必由人工控制。
继电器对于电报系统的工作而言是至关重要的。在长距离情况下,由于连接电报站的电线具有很高的电阻,因此电流会逐渐减弱。需要将微弱信号增强后再发射出去,继电器就是通过电磁铁控制开关来实现这一目的的。实际上,继电器是通过放大微弱信号来生成强信号的。
回顾一下继电器的原理,当继电器通电时,线圈铁芯产生磁性,将上面的金属簧片吸附下来,灯泡的开关闭合,灯泡亮了。
如果我们把灯泡的开关上面调换一下位置,默认灯泡电路连通,灯泡是亮的。这时,我们给继电器通电,灯泡开关的金属簧片将会向下闭合,灯泡将会熄灭。
以这种方式连接的继电器,叫做反向器(inverter)。
反向器的专用符号为:
和两个开关串联一样,我们将两个继电器串联,接上一个灯泡,如下图所示。
只有当两个继电器都被触发时,灯泡才会亮起。将两个继电器串联起来的组合,称为一个与门。
与门的专用符号为:
同样,将两个继电器并联,接上一个灯泡,如下图所示。
只要有一个继电器被触发,灯泡就会亮起。将两个继电器并联起来的组合,称为一个或门。
或门的专用符号为:
将串联的继电器输出连接方式稍微调整一下,可以得到一个或非门,简称NOR。相当于对或门的输出取反(如在输出端加一个反向器)。
NOR | 0 | 1 |
---|---|---|
0 | 1 | 0 |
1 | 0 | 0 |
将并联的继电器输出连接方式稍微调整一下,可以得到一个与非门,简称NAND。相当于对与门的输出取反(如在输出端加一个反向器)。
NAND | 0 | 1 |
---|---|---|
0 | 1 | 1 |
1 | 1 | 0 |
到此,我们已经有了4个逻辑门(与、或、与非、或非)和一个反向器。
最原始的继电器,称为缓冲器(buffer)。继电器除了在电报中用于放大信号,还可以用于延迟一个信号。这是因为继电器的触发,需要一点时间,例如几分之一秒。
缓冲器的符号:
二进制加法器
我们日常使用的,是以10为基数的十进制,用0到9共10个数来表示,逢10进1。但在计算机中,使用的是以2为基数的二进制数,用0和1共2个数来表示,逢2进1。
现在来看看1位的二进制数,加上另一个1位的二进制数,即两个1位的二进制数相加的结果。
第一个二进制数 | 第个二进制数 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 10 |
可以看到,当1+1=2时,需要进行进位,和为0,进位1,结果为10。因此,二进制的加法,可以拆成两部分来看,第一部分是不计进位的和(下面称为加和),另一部分是进位值。
计算加和 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
计算进位 | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
可以看到,相加后的进位值,和"相与"的结果是相同的。因此,可以使用与门来实现二进制加法的进位计算。
而对于"加和"部分,没有直接与之对应的逻辑门。
回顾一下前面的几种逻辑门,我们发现,有两个逻辑门与二进制加和的结果很接近。其中,或门在输入都为1时结果为1,与非门在输入都为0时结果为1,而二进制加和对于这两种情况都为0,其他情况则结果相同。
OR | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
NAND | 0 | 1 |
---|---|---|
0 | 1 | 1 |
1 | 1 | 0 |
稍微观察一下,不难发现,将"或门"和"与非门"的结果"相与",就是二进制加和的结果。
这实际上是一个非常重要的逻辑门,叫异或门(XOR)。专用符号为:
XOR | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
对于异或门,只有当两个输入相"异"时,结果才为1,如果两个输入相同则为0。
顺便提一下,如果对异或门进行取反(相当于在输出端加一个反向器),可以得到另一个门,叫做同或门(XNOR)。
XNOR | 0 | 1 |
---|---|---|
0 | 1 | 0 |
1 | 0 | 1 |
和异或门刚好相反,对于同或门,只有当两个输入相同时,结果才为1。
回到二进制加法,通过异或门求出加和,通过与门求出进位。将这两个门连接起来,就可以完整的计算1位二进制位的求和了。
这两个门的连接,可以简化表示为:
这个符号被称为半加器(Half Adder),也叫1位加法器。
当需要计算多位二进制数之和时,会涉及到进位计算。也就是说,除了求相同位置的两个二进制位之和,还要再加上低一位的进位值。所以,除了输入A、输入B,还有个进位输入。由于上面的门电路满足不了这个需求,因此被称为半加器。
没错,既然叫半加器,那么还有另一个叫全加器的加法器。全加器,即带进位求和的加法器。可通过2个半加器,加上一个或门来组成。
全加器的符号为:
如果将多个全加器连接起来,就可以实现对多位二进制数进行求和了。
小结
- 从开关,到继电器,可以实现基本的与门、或门和反向器;
- 通过对与门、或门和反向器的组合,形成新的与非门、或非门;
- 将或门、与非门和与门进行组合,形成新的异或门;
- 异或门可以求加和,与门可以求进位,组合起来就变成一个半加器;
- 使用两个半加器,加上一个或门,就得到了一个完整的全加器;
- 如果将多个全加器再组合起来,理论上讲可以实现对任何数据的运算。
一个小小的开关,竟然如此之强大。既可以用于表示0和1,也可以用来实现计算逻辑。通过层层组合,可以表示各种各样的信息,可以实现各种各样的计算。
有一本书叫《技术的本质》,其中就提到了技术的发展,其实都是建立在原有的技术之上,一个个叠加,一个个组合而来的。最核心的本质,其实一直都没有变。
参考
维基百科
《编码:隐匿在计算机软硬件背后的语言》Charles Petzold
《大话计算机》冬瓜哥