二进制加法表:
+ | 0 | 1 |
0 | 00 | 01 |
1 | 01 | 10 |
第一位叫做进位位,第二位叫做加法位 |
这个表可以拆分成两个表:
+加法 | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
+进位 | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
可以看出进位表和与门输出结果是一样的
AND(与门) | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
因此可以利用与门计算二进制数加法的进位。
如何表示加法呢?
我们观察一下加法和或门(红色1处不同)
OR(或门) | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 1 |
在看一下与非门(红色1处不同)
NAND(与非门) | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
将它们画在一张表:
输入A | 输入B | 或门输出 | 与非门输出 | 想要的输出 |
0 | 0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 0 | 0 |
仔细观察会发现,我们要想输出1的情况只有在或门和与非门输出都为1时。因此我们在加一个与门就可以实现加法了。
如上图,就是我们想要的加法(不包含进位输入)。
实际上,上图这个电路有个专门的名称,叫做异或门,简写为XOR。
特定的符号为:
XOR(异或) | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
到现在,两个二进制数相加的结果是由异或门的输出给出的,而进位是由与门给出的。因此我们可以将与门和异或门连在一起来计算两个二进制数。如下图,可以计算A和B的和
为了避免重复画与门和异或门,可以采取如下简单的表示方法。
这个符号被称为半加器(Half Adder)。之所以叫半加器是有原因的,它将两个二进制数相加,得出一个加法位和一个进位位。但绝大多数二进制数是多于1位的。半加器没有做到的是将之前一次加法可能产生的进位纳入下一次计算中。
为了将进位纳入计算中,我们可以使用两个半加器、一个或门做如下连接:
工作情况:
输入A | 输入B | 进位输入(来自前一位进位) | 加和输出 | 进位输出 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
可以看出,符合二进制加法。
为了避免重复地画上面图,我们用以下形式来替代上图地一堆符号,它称为全加器(Full Adder)。
不过这个全加器只能对一位的二进制数做加法,如果我们需要多位的二进制数做加法可以将它们串起来,例如8位二进制加法可以如下实现:
其中最低位的进位输入为0。
16位加法器可以如下实现(接地表示输入为0):