计算机是如何实现加法的

先回顾一下那些常见的逻辑操作:

1、AND(与)运算:

只有输入都为1时结果才为1

AND

0

1

0

0

0

1

0

1

电器符号:

and.png

2、OR(或)运算:

有一个输入为1时结果就为1

OR

0

1

0

0

1

1

1

1

电器符号:

OR.png

3、NOR(或非)运算:

对或操作结果取反

NOR

0

1

0

1

0

1

0

0

电器符号:

nor.png

4、NAND(与非):

对与操作结果取反

NOR

0

1

0

1

1

1

1

0

电器符号:

NAND.png

利用这些非常简单的门电路我们就可以实现CPU中最关键单元加法器

二、一位二进制的加法

先来看一下只有一位的二进制数的加法是如何实现。一位的加法结果,如下表所示:

0

1

0

00

01

1

01

11

我们把结果分为个位和十位两个部分来看一下。先单独看一下十位的结果:

0

1

0

0

0

1

0

1

这个看着这么眼熟,这个不就是与运算吗,十位的计算如此简单只需要一个与运算:

add_1.png

搞定了十位我们再来看一下个位,先看一下个位的运算结果:

0

1

0

0

1

1

1

0

我们除去右下角看其他部分,和或运算结果是完全一致的。再单独看一下右下角,输入都为1时输出为0这不就是与非的操作结果吗。那我们将输入同时给到或门和与非门看下他们的输出:

add_xor_result.png

再看一下这个输出,将或门和与非门的输出看为输入将我们想要的结果看为输出,其正好符合与运算,所以我们只要将输出再合并到与门的输入,就完成了个位的运算:

xor_2.png

这个组合就是异或门,简写XOR,当且仅当两个输入不一致时输出1。符号为:

xor.png

现在个位和十位(近位)的计算都实现了,我们把这两个结合在一起就实现了一位的二进制加法:

add.png

这组合称为半加法器,但每次都画这么多也不方便所以单独设定一个符号:

add_2.png
三、带进位的加法:

对于两位以上二进制加法,例如11+11,是需要将进位也加上的,但半加器只能计算一位的加法,它的输入也并没有上一位的进位。所以要实现多位的加法需要先实现进位相加。

先来看一下带进位的加和输出是如何得到的,处理方式和我们平时计算是一样的:

  1. 现在有输入A,B和进位输入C0
  2. 对输入A和B计算得到加和输出S1和近位输出C1。
  3. 将上面得到的加和S1和进位输入C0相加,就得到加和S2和近位输出C2,那么S2就是加和输出。

和我们小学时学的计算一毛一样

再来看一下进位输出如何计算的:

我们知道,对于A、B和C0三个输入最大就是三个都为1和为11的情况,所以最多也就产生一个为1的进位。那现在就很明了,这进位要么在计算A加B是产生(A和B都是1)要么在加进位是产生(A和B其中只有一个为1,进位输入为1),所以只要将两次加和的进位输出做一次或运算,就取得了进位输出。

最终电路图如下

add.png

这组合称为全加器,但个符号还是有点复杂了,所以有个特定符合:

add.png
四、多位的加法

前面已经实现了进位相加,那么多位加法就非常简单了。和我们平时计算一样,将上一位的进位给到下一位,第一位可看做进位为0。多位加法实现也是如此,将上一位的进位输出作为下一位的进位输入,第一位进位输入0。如下图:

add.png

还是一样的这个图画起来太复杂了,给个简单的:

add.png
五、超前进位加法器:

上面实现的加法器,运算时除第一位外其他位运算都依赖上一位的进位输出,只有等上一位计算完成后给出进位值,该位的计算才是正确的,所以这又被称为波进位加法器。

但其实对于上一位的进位输出是可以根据输入自己去计算得到的,即某一位An可以利用前面几位A1、A2、...、An-1计算得到不必等待,虽然这样使计算更多了但实际的速度确是提升的。这样加法的实现称为超前进位加法。

add.png

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发技术

排序之希尔排序(shell sort)

本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都...

1243
来自专栏程序员叨叨叨

6.7 操作符优先顺序

Cg语言中操作符的优先顺序如表 3所示,从上到下表示从高级到低级的优先级;同一行的操作符具有同等优先级。该表参考了Cg教程_可编程实时图形权 威指南第3.3.1...

962
来自专栏前端小作坊

0.1+0.2=0.30000000000000004问题的探究

首先声明这不是bug,原因在与十进制到二进制的转换导致的精度问题!其次这几乎出现在很多的编程语言中:C/C++,Java,Javascript中,准确的说:“使...

811
来自专栏软件开发 -- 分享 互助 成长

希尔排序

1、希尔排序介绍 希尔排序是对直接插入排序算法的一种改进,当记录较少或者记录本身基本有序的时候直接插入排序的优势非常明显,所以希尔排序就是通过人为的创造这两个条...

1968
来自专栏chenjx85的技术专栏

leetcode-551-Student Attendance Record I(判断是否出现连续几个相同字符)

1386
来自专栏用户2442861的专栏

Python基础08 面向对象

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

713
来自专栏海天一树

小朋友学C语言(25):两数交换

(一) #include <stdio.h> int main() { int a = 10; int b = 5; printf("B...

3006
来自专栏Python小屋

Python花式编程案例集锦(9):sorted()函数中消失的cmp参数

明天开启全国巡讲Python模式,连续8场20天讲课,外加路上来回大约16天,这个假期有的忙了。所以接下来的一段时间里不一定能像以前更新的那么频繁,我尽量。

983
来自专栏醒者呆

面向程序员编程——精研排序算法

这篇文章很长,我花了好久的时间(中间公司出了bug,加班了好几天( ¯ ¨̯ ¯̥̥ ))进行整理,如有任何疑问,欢迎随时留言。 关键字:排序算法,时间...

3705
来自专栏静晴轩

JavaScript 字符串实用常操纪要

JavaScript 字符串用于存储和处理文本。因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作...

3897

扫码关注云+社区