最强大脑,计算机中1+1=2的实现逻辑

在计算机硬件层面上,你知道1+1是如何实现的吗?本文先介绍了继电器的基本原理,然后从分析与或非等逻辑门电路入手,推导出异或门的实现,借助异或门从而实现1+1,并得出全加器的基本原理。

前言

计算机中处理的都是二进制,1+1=2转成二进制表示为 1 + 1 = 10, 10表示相加结果为0, 并且有进位。如图所示,该运算可以拆分成求和和求进位。

求和的特点是0 + 0 = 0, 1 + 1 = 0, 0 + 1 = 1, 1 + 0 = 1. 可以看到,相同的数相加为0, 相反为1, 其实就是作异或。

求进位的特点是 0 + 0 = 0, 1 + 1 = 1, 0 + 1 = 0, 1 + 0 = 0,就是有0的话,结果就为0, 其实就是作与。

所以,该加法运算就可以拆分成一个异或运算和一个与运算。那么异或和与运算又是如何实现的呢?下面我们先从最简单的讲起。

0.接地

下图大家都很熟悉,一个电池接上一个灯泡,合上开关后,灯泡就亮了。它的基本原理是电子从电池的负极进过灯泡后到达正极,和正极的质子结合达到稳定状态。灯泡中有个金属片和钨丝,电子进过灯泡的金属片后,由于有电阻所以会发热,如果达到了钨丝的燃点后,钨丝在真空就会发亮。

上图有个问题就是如果电池和灯泡相距很远的话(比如广州到北京), 铺线的成本很高,来回都要一根线,有没有什么更节约成本的方法呢?肯定有, 我们知道地球本身就是一个巨大的导体,里面有无穷无尽的电子,灯泡可以直接接地,从地球上吸收电子,而电池将负极的电子接入到地球。这样的话,可以节约一半的铺线成本,如下图所示。

此处灯泡和电池接地是个示意图,只是为了说明这么个原理。真正这样做的话,灯泡肯定不亮,因为电池的电压相对地球来说太小了,地球的电阻相对电池来说太大了。

工程实践上,将上图简化为下图的方式来表示,将接地的电池用V来表示。

1.继电器

如果要长距离的传输,由于长导线的电阻越大,电流越小,功率就越小,为了使得灯泡一样亮,就需要增加电压。但是导线的长度可以近似无限增大,但是电压没法无限增大,所以需要一套中继系统,通过这套系统将比较弱的输入电流“放大”成较强的输出电流。这套中继系统就叫继电器。它的结构如下。

电流通过缠绕在铁棒的导线,会产生磁场。继而将上面的那个开关拉下来,从而接通该电路。以前的电报就是类似的原理,如下图所示,发送方按下开关,铁棒那里产生磁场,将另外一个开关合上,从而收端将电磁铁上面的活动杆拉下; 发送端松下开关,活动杆就弹回去了,从而能够听到“滴-答”的声音。“滴-答”声的长短代表了不同的含义,从而用来传递各种信息。

2. 与门

什么是门?继电器的组合就叫门,多个继电器可以并联或串联在电路中以执行各种基本功能。 将各种门组合起来可以实现复杂的功能。

将两个继电器串联起来叫与门。如下图所示,红色表示通电。只有当两个继电器都通电后,灯泡才亮,其它三种情况灯泡都不亮。当然,继电器的可以再接继电器、各种门,不一定是灯泡。

电气工程师用下图来表示一个与门。可以把按下开关当作1,断开开关为0。只有当两个输入都为1时,输出才为1,其它情况均为0。 同编程语言中的与(&)操作。 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

输入和输出的关系可以用下表来表示。

3.或门

当两个继电器并联在一起时称为或门。这种情况下,只要有一个继电器通电,灯泡就亮。只有当两个继电器同时断开时,灯泡才不亮。

可以用以下符号来表示或门。同编程语言中的或(|)操作符。 0 | 0 = 0, 0 | 1= 1, 1 | 0 = 1, 1 | 1 = 1。

或门的输入和输出的关系可以用下表表示。

4. 反向器

反向器就是将高电平转为低电平。断开开关时,灯泡亮。闭上开关时,灯泡反而不亮。反向器通常不会叫做一个门,主要是门通常是由两个或多个继电器组合而成的, 而反向器只需要一个继电器。

反向器用以下符号来表示。类似于编程语言中的取反操作符。 ~0 = 1, ~1 = 0.

5.与非门

与非门就是两个反向器并联在一起。只有当两个反向器都合上开关时,灯泡才不亮。刚好和与门相反。

用以下符号来表示一个与非门。在与门的基础上加上一个小圆圈,表示在与门结果上取反。

与非门的输入和输出之间的关系入下表, 只有当两个输入端为高电平(合上开关)时,输出才为低电平。

6. 或非门

两个反向器串联在一起称为或非门。只有当两个反向器的开关都打开时,灯泡才亮,刚好和或门完全相反。和与非门的区别是第2,3种情况,打开任意一个反向器,或非门不亮,而与非门亮。

用以下符号来表示或非门, 在或门的基础上加上个小圆圈,表示在或门的结果上取反。

或非门的输入和输出的关系如下。只有当两个输入端都是低电平(断开开关)时候,输出才为高电平。

7.异或门

异或门是如何实现的呢?异或门可以通过一个或门和一个与非门来实现。如下图所示,或的结果和与非的结果再作与后,得到的就是异或的结果。两个输入端,相同为0,相反为1.

或门和与非门通过一个与门连接起来就是异或门。各个继电器的连接关系入下图。与门、或门、与非门、或非门各需要两个继电器,一个异或门需要6个继电器。

异或门用下图来表示,在或门的基础上增加一根曲线。

异或门的输入和输出的关系入下表,用XOR表示异或, 输入相同为0, 相反为1。 同编程语言中的异或(^)操作符。0 ^ 0 = 0, 1 ^ 1 = 0, 1^0 = 1, 0 ^ 1= 1.

8. 1+1= 2?

分析完与门和异或门后,现在再回过头来看下开头说到的如何实现1 + 1 =2 的功能。一位的加法就相当于一个异或门求和, 一个与门求进位。如下图所示。

该电路图用以下这种较简单的方式来表示,该符号表示为半加器,原因是因为它没有将之前的进位加上。

通过半加器可以处理1 + 1 = 2 的运算,但是如果操作数位数大于1位,则还需要能够处理进位的功能。

为了能够处理之前的进位,在半加器的基础上改进下,通过两个半加器和一个或门组合起来就可以组成一个全加器(FA)。一个半加器需要8个继电器, 一个全加器需要18个继电器来实现。如下图所示。

全加器用以下符号表示, Carry In (CI)表示低位的进位,Carry Out (CO)表示当前位的进位。如果是最低位相加,则CI位设置为0,表示没有进位。

如果要实现两个8位数的相加,则需要8个全加器(总共需要144个继电器),通过下图所示的方式连接起来。低位的CO接到高位的CI上,A,B分别表示两个操作数。

下图是对上图的简化描述,表示一个8位的加法器, 其中A7...A0表示操作数A的二进制表示中的第0位到第7位,B表示另外一个操作数, S表示A和B相加后的结果。

如果要实现一个16位的加法器,只需要将两个8位的加法器串联起来即可。第一个8位加法器的CO接入到第二个8位加法器的CI位。如下图所示。

结语

现在的计算机真的是像现在这样实现加法的吗?原理类似,但是有两方面的改进。

一个是运算效率方面的提升,从上面看到的8位全加器,都是需要等待低位运算完后,高位再将低位的进位拿来参与运算,这样运算的速度就取决于操作数的位数,如果位数较多的话,速度会比较慢,这种实现方法叫作行波进位。目前计算中普遍采用的是前置进位,该方法可以提高运算速度。

另外一个是制作工艺的改进,继电器用在上世纪四五十年代的数字计算机中,现在的计算机都是用晶体管。晶体管相对继电器的优势是体积小、速度快、能耗低、噪声小、而且还更便宜。如果搭建一个8位全加器,也需要用到144个晶体管(如果采用前置进位,则需要更多的晶体管),但是体积小很多。

原文发布于微信公众号 - 腾讯技术工程官方号(Tencent_TEG)

原文发表时间:2017-04-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏公有云大数据平台弹性 MapReduce

分布式sql引擎原理分析-逻辑执行计划生成

本文档以当前流行的分布式大数据查询引擎Presto为切入点,分析一个query语句怎么生成为一个分段的逻辑计划。

1.1K13
来自专栏IMWeb前端团队

AMD and CMD are dead之js模块化黑魔法

缘由 在2013-03-06 13:58的时候,曾甩下一片文章叫:《为什么不使用requirejs和seajs》,并放下豪言说发布一款完美的模块化库,再后来就把...

2477
来自专栏Jimoer

Java设计模式学习记录-桥接模式

这次介绍结构型设计模式中的第二种模式,桥接模式。 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度。

722
来自专栏编程一生

lucene原理及源码解析--核心类

1552
来自专栏数据结构与算法

P1991 无线通讯网

题目描述 国防部计划用无线网络连接若干个边防哨所。2 种不同的通讯技术用来搭建无线网络; 每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。 任意...

2886
来自专栏一名叫大蕉的程序员

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。 111...

1955
来自专栏数据结构与算法

BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)

为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M。初始...

1213
来自专栏数据结构与算法

洛谷P2704 [NOI2001]炮兵阵地(状压dp)

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示)...

642
来自专栏栗霖积跬步之旅

一天一个设计模式:策略模式

策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情...

1082
来自专栏追不上乌龟的兔子

使用Python标准库functools中的lru_cache实现缓存

很简单,也很容易理解,但是不难发现这个函数在计算斐波那契数列的时候事实上进行了很多重复计算,例如:

1854

扫码关注云+社区

领取腾讯云代金券