计算机怎么实现加法?今天学习了一下,主要是根据电子电路的特性制定一套规则来模仿人类的加法并最终实现。
既然是实现人类的十进制加法,就得先回顾下我们自己的加法法则。
先看看十进制加法 :
122
+ 78
= 200
对于十进制运算我们知道,进行加法时,低位满10要向高位进位,二进制改成满2进位即可,都是一样的,只是又基数10变成了基数2.
比如二进制加法:
1111010 (122)
+ 1001110 (78)
= 11001000 (200)
按十进制的加法规则转成满二进位的规则,同样实现了二进制加法,不过这是实现二进制加法的理论部分,理论的输出输入,总得有个对应的物理操作才能实现吧,比如你用算盘计算12+3,总得把算盘的算珠用手拨动一下吧,用纸计算一个加法,也得在纸上写一下12+3吧,到最后把计算结果一统计,就知道刚刚的加法结果了,有人说我们直接就能心算出12+3了,不用纸和笔啊,那是因为我们对于简单的数已经熟练到形成条件反射了,如果计算一个很大的数我们未必能直接心算出来,那就得借用存储临时数据的媒介(比如纸币和算盘),同样的道理,计算机计算加法也是需要一个物理动作,也需要存储媒介和实现加法的物理动作,但是微观物理电路有个特点,他没长脑袋,他不知道什么是数字0和1,对他而言,他只有高压和低压,通电和断开这些物理状态,而这些状态,恰恰被聪明的人类发现,被人为的利用代表成了数字0和1,比如+5v电压代表数字1,0v代表数字0,这样物理电路的高低压就能帮我们储存数据了,这样加法的一个要素,存储媒介已经完成,下面就是要利用物理电路来实现加法的物理动作,这个时候我们要继续人为的制定规则来拼凑出我们要的结果,
我们既然可以根据我们人类的思维方式来定义一个加法法则来运算,当然也可以给物理电路的属性定义一套运算规则,帮我们也完成运算,例如我们规定这样一个规则: 0 和 0 = 0 ,0 和 1 = 1, 1 和 0 = 1, 1 和 1 =0 。注意这个规则不再是我们说的加减乘除法规则了,这是一套新的规则,我们要跳出来,有了这套规则,我们就知道了,两个相同的状态会生成一个0的状态,两个不同的状态会生成一个1的状态,姑且管这个运算法则叫异或运算吧,这个异或运算对应的物理操作就是电压状态的转变规则 。
如果我们依旧把计算机世界的各个部分组成的世界比喻成计算机星人世界,那么这里一对比就是地球人有加法,计算机星人也有加法,只是这个加法他们不叫加法叫异或运算,
并且他们的异或运算和我们的加法有点不一样,但是目的都是为了实现加法流程。
掌握了这个异或运算规则,那么就可以进行二进制加法了吧,来看看以下例子:
1 1 1 1 0 1 0 转成10进制-> 122
异或操作 1 0 0 1 1 1 0 转成10进制-> 78
不考虑进位的异或操作结果 0 1 1 0 1 0 0 转成10进制-> 52 和 理论结果 200相差很远啊
为什么用异或运算,算出来的结果不是我们想要的结果,难道计算机星人的异或运算规则有问题?其实这个异或运算只完成了加法的一部分而已,因为我们忘了进位了,小时候我们在做加法运算时,有的同学喜欢先把进的位写在一边,先把个位数直接加完,最后在把进的位补加上去.
比如计算 22
+ 19
先不考虑进位 31 , -> 这个是半成品,只完成了加法的一部分。
把进的位记上 10
再补加上 41 -> 算上进位才是完整的加法。
同样的道理,刚刚的异或运算也没有考虑进位,所以没有完全做完,把进的位先记在一边,然后再次进行异或运算,(可能会有多次异或运算)最终得到正确结果 11001000。
实际电子电路实现加法的过程中用到的物理单位有半加器和全加器,半加器就是不考虑进位来实现异或运算的电子原器件,这种加法只能做一部分加法,所有加半加器,全加器就是考虑了进位的电子原器件,有了这些物理单位,给他们输入要算的数,就能让他们完成我们要的加法了。