加法的实现
一、一些简单但足够了的的电学知识
要了解加法是怎么实现的,首先我们来看一些电学中的知识。毕竟CPU本质上只是一个庞大的电路实现,虽然CPU完整电路非常复杂,但其却是有几个非常简单和最基础的电学原件组成的(真的非常简单!!!)。
1. 与门
与门只有当两个输入都为1时才输出1,其输入与输出如下:
输入 | 1 | 0 |
---|---|---|
1 | 1 | 0 |
0 | 0 | 0 |
2、或门
或门只要有一个输入为1时输出就为1,其输入输出如下:
输入 | 1 | 0 |
---|---|---|
1 | 1 | 1 |
0 | 1 | 0 |
3、与非门
输出和与门完全相反,其输入输出如下:
输入 | 1 | 0 |
---|---|---|
1 | 0 | 1 |
0 | 1 | 1 |
我们只需知道这三个基本的电路就,我们就可以用这个三门来搭建一个加法器。
二、二进制加法
现在我们有两二级制数A和B,值分别为A=10010001,B=11010011,我们先人工来算一下他的和:
我们在人工进行计算时从右往左依次将后两位进行相加,如果有进位则进行进位相加。
其实计算机在实现二进制加法时也是这样逐位相加的,有进位则进位。
我们先来看一下1位二进制数加法表:
+ | 0 | 1 |
---|---|---|
0 | 00 | 01 |
1 | 01 | 10 |
仔细看这个一位加法表,在进行一位的加法时只有当两个加数都为1时才会发生进位。我们不妨把结果分为加法位和进位,我们在分别来看一下加法位和进位的情况:
1、加法位
+ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
仔细观察这个加法位表,如果不看右下角的话,那不就是或门的输出吗。如果不看左上角的话,那不就是与非门的输出吗。
这样我们想要的就很明了了,就是将或门和与非门的输出结合起来。我先看一下相同输入的情况下或门和与非门的输出:
电路连接:
输入输出结果表:
A | B | 与非门输出 | 或门输出 | 想要的结构 |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
仔细观察与非门、或门的输出和想要的结果,是不是非常眼熟,当两个门的输出同时为1时就是我们想要的1其他为0,这不就是与门吗。
所有我们只需将与非门和或门的输出作为一个与门的输入,就可以得到加法位的结果,如下:
其实这个电路有个专门的名称叫做异或门,只有单两个输入都不相同时输出才为1,符号如下:
实现了加法位我们再来看一下进位
2、进位
一位加法的的进位结果如下:
+ | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
看这个表是不是更加眼熟,这不就是我们的与门吗,所有我们只需一个或门就可以实现进位。
现在加法位和进位我们都已经实现了,接下来只需要将二者连起来就实现了一个一位的加法器了,如下:
为了避免每次都要画出与门和异或门,这个加法的实现我们用一个特殊的符号来表示,如下:
我们成其为半加器,因为他只能将两个一位的二进制数相加,但我们做加法时往往都有进位相加的情况。
为了实现进位相加我们可以利用两个半加器和一个或门,按如下电路图进行连接:
首先将输入的A和B进行相加得到的结果在和进位相加得到加法位的结果,对于进位毕竟三个一位的二进制数相加能得到的最大结果为11(1+1+1)进位最多发生一次,所以使用或门输出进位。如果没有进位那进位输入为0。
其实这个电路图也有一个专门的符号,让我们免于每次都画一个完成的全加器。
现在我们已经实现的进位的加法了,计算机加法的实现页差不多了,现在只剩下一个问题,如何进行多位的加法那?比如8位的加法,这个也非常简单只需将一个全加器的进位输出作为下一个全加器的进位输入来扩展。
8为的加法器实现如下图:
一般使用符号如下:
到这加法的实现就结束完了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。