上一篇博客写到[java基础/二进制之原码,反码,补码],链接:java基础/二进制之原码,反码,补码_gushibuhou的博客-CSDN博客
突然有点好奇计算机是怎么实现加法运算的,网上搜索一下,我也来个对自己理解的总结.
先来科普一下最基本的继电器和与门,或门,非门
1.继电器,继电器就是通过电磁铁的通断电来控制主电路的通断,早期的电脑就是使用继电器组成的,继电器有常开触点和常闭触电,下面的2张继电器的图就是从网上找来的,第1张是常开触点,控制端不通电,继电器不吸合,第2张是常闭触点,控制端不通电,继电器吸合,主要是用于非门.其实也可以用常开按钮和常闭按钮简单理解
2.与门,与门就是2个输入端,只要其中1个为0,那么输出就为0,左边为符号,右边为电路理解,下面为加法表和真值表
加法表 | 真值表 | |||||
A | B | F | ||||
与门 | 0 | 1 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 1 | 0 | |
1 | 0 | 1 | 1 | 0 | 0 | |
1 | 1 | 1 |
3.或门,或门就是2个输入端,只要其中1个为1,那么输出就为1,左边为符号,右表为电路理解,下面为加法表和真值表
加法表 | 真值表 | |||||
A | B | F | ||||
或门 | 0 | 1 | 0 | 0 | 0 | |
0 | 0 | 1 | 0 | 1 | 1 | |
1 | 1 | 1 | 1 | 0 | 1 | |
1 | 1 | 1 |
4.非门,非门就是取反,输入为1,输出为0,反之亦然,左边为符号,右表为电路理解,下面为加法表和真值表
加法表 | 真值表 | ||||
A | F | ||||
非门 | 0 | 1 | 0 | 1 | |
1 | 0 | 0 | 0 |
好了,说完继电器,与门,或门,非门,接下来要说说加法器了,加法器的加法表如下所示
+ | 0 | 1 | + | 0 | 1 | |
0 | 0 | 1 | 或者 | 0 | 00 | 01 |
1 | 1 | 10 | 1 | 01 | 10 |
我们可以把结果拆分为加法位(低位)和进位位(高位)
加法位的逻辑表:
+加法 | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
我们可以看出加法位逻辑表就是异或门的逻辑表,那么异或门是由什么组成的呢?下面说2中方法
方法1:根据已有的基本的与或非门进行组装,个人觉得这种难度比较大,适合于简单的逻辑,或者是脑力比较好的人
我们可以发现异或门与或门和与非门都有点相识,都只差一个值,通过观察,我们发现,如果把或门 与上 与非门 就刚好是异或门
OR(或门) | 0 | 1 | NAND(与非门) | 0 | 1 | |
0 | 0 | 1 | 0 | 1 | 1 | |
1 | 1 | 1 | 1 | 1 | 0 |
所以异或门的组成方式可以是
方法2:根据逻辑表得出公式
观察加法位的真值表
A | B | E |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1.找到输出F=1的行
2.把它们的输入,也就是这里的A和B,写成逻辑乘的形式。
3.把第二步得到的各项用逻辑加连起来。
所以结果就是,所以异或门的组成方式可以是
这样使用到的门的数量是比上面的多,我们可以对上面的等式进行处理
这样和方法1得出的公式是一样的
好了,异或门的组成就讲到到这里,异或门的简写符号:
接下来讲讲进位位,进位位的逻辑表很明显就是一个与门:
与门 | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
可以将与门和异或门连在一起来计算两个二进制数(即A和B)的和:
半加器的简写符号为:
之所以叫半加器是有原因的,因为它没有做到的是将前一次的加法可能产生的进位位纳入下一次运算,因为只有2个输入,需要3个输入才能把上一次的进位变成这一次的输入.
我们先总结一下半加器(上划线变成了字母前边的`)
A | B | C | S |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
进位C=AB | |||
加位S=`AB+A`B |
先贴一个全加器想要的结果
Ai | Bi | Ci-1 | Ci | Si |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
从图中我们可以看出
Ci=`Ai*Bi*C(i-1)+Ai*`Bi*C(i-1)+Ai*Bi*`C(i-1)+Ai*Bi*C(i-1)
=(`Ai*Bi+Ai*`Bi)*C(i-1) + Ai*Bi
而`Ai*Bi+Ai*`Bi就是AB 经过半加器的加位S,Ai*Bi是AB 经过半加器的进位C
所以Ci就是AB 经过半加器的加位S与上C(i-1),在和上AB 经过半加器的进位C
Si=`Ai*`Bi*C(i-1)+`Ai*Bi*`C(i-1)+Ai*`Bi*`C(i-1)+Ai*Bi*C(i-1)
=(`Ai*`Bi+Ai*Bi)C(i-1) + (`Ai*Bi+Ai*`Bi)*`C(i-1)
`Ai*`Bi+Ai*Bi 是Ai和Bi的同或门,`Ai*Bi+Ai*`Bi是Ai和Bi的异或门,两者是互补的关系,而C(i-1)和`C(i-1)也是互补的关系
所以Si其实就是Ai和Bi的异或,再和C(i-1)异或,可以参考上图.
以上就是全加器的逻辑推理,全加器的简写符号如下:
如果是多位相加,我们以8位为例,8位连接线路如下:
下面是画成一个盒子的完整的8位二进制加法器:
结语:
如今,计算机已经不再使用继电器了!尽管它曾经被使用过。
第一台数字计算机在20世纪30年代被建造完成,当时所使用的就是继电器,后来也使用过真空管。
今天的计算机使用的是晶体管。
在被用到计算机中时,晶体管的工作方式与继电器基本相同。
但是晶体管要比继电器计算速度更快,体积更小,而且噪声更弱、耗能也更低,而且更便宜。
搭建一个8位加法器仍然需要144个晶体管,但是电路却是极小的。
前几天突然有个想法,使用java写了一个不用加号实现加法运算,原理就是上面的原理,java代码如下
//不用加号实现加法运算
public void add(int a,int b){
while (b != 0){
//个位
int c = a^b;
//进位
int d = (a&b) <<1;
a = c;
b = d;
}
System.out.println(a);
}