《编码》读书笔记 —— 计算机世界中的加法
可能你不知道,计算机的世界做的唯一工作就是做加法计算。
先来回顾一下在进行十进制加法的步骤。比如让245和673相加,会把这个问题分解为几个简单步骤,每个步骤只需要将两个十进制数相加。比如先把5和3相加,小时候背过的加法表就是解决这个问题。
二进制不同于十进制的地方在于二进制相加的情况更加简单,情况更少。如下表:
为了保持一致,使得每个结果都是两位数。改进如下:
然后进行分析。发现二进制相加中,其中一位叫做加法位,另一个叫进位位。
加法位:
进位位(和与门的输出结果一样):
看到这个结果是否产生了什么联想。和上一篇讲的真值表,逻辑门似乎有些相似。
其实在二进制加法中,加法和进位是分别进行的。运算过程和十进制加法一样。将数字串从右往左一次逐渐相加进位。
接下来以一个加法长度为8位的简单加法器为例子。也就是我们要加的二进制数,范围是0000 0000 到1111 11111。相加和最大可以为1 1111 1110,十进制为510.
输入设备如下:
最上面一排是被加数,第二批是加数
最后代表输出:这一排是灯泡(灯泡亮的代表1,不亮的代表0),注意这里为什么需要9个灯泡。因为两个八进制相加结果可能为9位。
比如想要把0110 0101 和1011 0110相加,表示及结果(1 0001 1011)如下
上面提到,利用与门可以计算出两个二进制加法的进位。麻烦的是加法位这么弄。加法的真值表和或门及与非门有些相似。
通过对比和明显的想到几者之间的关系。将或门和与非门输出的结果和一个与门串联就得到了加法位的真值表。图如下:
在电学上有个专门的符号表示这个电路,叫异或门。
类型 | 电路图 | 符号 | 说明 | 真值表 |
---|---|---|---|---|
异或门(XOR) | 只有当其中一个输入为1才输出1 |
至此,我们已经得到两个二进制数相加的结果由异或门的输出给出,进位位由与门的输出给出。于是将异或门和与门连在一起计算二进制数的和
同样也有简化的符号图(半加器)
半加器意思就是没有加完,因为这个电路图还没实现进位的功能。
常规来讲两个二进制相加,半加器只能用于最右边的一列。如果存在进位,从右边算起的第二列,实际上需要三个二进制位相加。对于三个二进制位相加,需要将两个个半加器和一个或门连接。
工作原理:从最左边第一个半加器输入A、B。会产生一个加法位和进位位。加法位必须和前一列的进位位相加。然后在把他们输入到第二个半加器中。第二个半加器输出的加法为是最后的结果。两个半加器的进位输出又被输入到一个或门中。为什么这里用或门,本来应该一个半加器的。因为两个半加器的进位输出不可能会同时为1(比如这里如果A和B相加进位1,则此时加法位必定为0,第二个半加器中B已经为0了,不可能再次进位),所以或门在这里就已经够了。因为或门和异或门的区别仅仅在输入都为1的时候才不同。
同样用符号代替上面的图
现在讲前面提到的电路连起来。首先将最右端的两个开关和最右端的一个灯泡连在全加器上。最右端没有进位输入,所以用接地代替,输入为0。
接下来第二列及剩下的。第一个全加器的进位输出就是第二个全加器的进位输入。
注意,第8个灯泡和最后一对开关要以如下方式接在全加器上,有进位的情况,最后一个进位输出到第9个灯泡上。
汇总一下,这图,这逻辑很漂亮。8个全加器连在一起,每个全加器的进位输出都作为下一个全加器的进位输入。
简单表示如下:
另一种简单表示:
扩展到16位二进制加法器,也就是把两个8位二进制加法器级联在一起。以此类图什么24,32位加法器。这是自己编的。原理也一样。注意第一个、中间连接点、最后一个.
至此,可以说是把计算机最为基础的加法介绍完了。当然这种加法器是上古时代的加法器。通过上面的分析,加法器的总体速度取决于数字的位位乘以全加器器件的速度。到后来有一种超前进位加法器(carry look ahead adder),它是对普通的全加器进行改良而设计成的并行加法器,主要是针对普通全加器串联时互相进位产生的延迟进行了改良。超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的。