数字电路——加法器
我们之前了解了门,电路就是门的组合。
电路又可以分为两大类,组合电路和时序电路。
但作为计算机和编程的知识铺垫,我们要了解的是组合电路的使用方法。所以本篇讲的是组合电路的运算(电路的布尔运算。)
推导过程略看也行。建议还是看看,了解一下。
输出仅由输入值确定的电路
把一个门的输出作为另一个门的输入,就可以把门组合电路.

如上图,两个与门的输出被用作或门的输入。
注意:
电路分析 我们倒着看,按照门来分析
- 如果X=1则说明,D和E至少有一个是1.
- 如果D是1,则AB都必须是1
- 如果E是1,则AC都必须是1
真值表如下
| A | B | C | D | E | X |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 |
三个输出就是8种组合哦( 23).中间显示了电路中间值(D和E)。
此时我们可以用布尔代数来表示电路。因为电路是一组互相关联的门,所以表示电路的布尔表达式是布尔运算的组合。
在这个电路中,有两个表达式。每个运算的输出是或运算的输入。
因此~(AB+AC) 这个布尔表达式表示了这个电路
详细点就是
- (AB=D AC=E)
- D+E=X
- 然后参考真值表就行。
我们现在从另一个方向入手,从布尔表达式绘制对应的真值表和逻辑框图。
例如 A(B+C) 这个表达式中,两个输入值B和C进行或运算。这个结果和A作为与运算的输入,以产生结果。对应的逻辑框图如下

《计算机科学概论》P69
分析:(门关系)
- A(B+C)为1,则A与B+C都必须为1
- B+C为1 则 B和C不能全部为0
- A为0则输出为0(A(B+C))
对应的真值表如下
| A | B | C | B+C | A(B+C) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 |
我们可以使用真值表任一行去验证结果。
比如第三行
A=0 B =1 C=0 B+C=1+0=1(或门,有一个输出1就行) A(B+C)=0(B+C=1)=0
(与门,两个输出必须同为1才输出1,否则输出0)
逻辑代数(布尔代数)所表示的是逻辑关系,而不是数量关系。
比较这两个例子的最后的一列,完全一致。这就是电路等价
电路等价:对应每个输入值组合,两个电路都生成完全相同的输出
在了解了上面的基础知识后,我们就可以利用可证明数学的法则来设计逻辑电路。
| 性质 | 与 | 或 |
|---|---|---|
| 交换律 | AB=BA | A+B=B+A |
| 结合律 | (AB)C=A(BC) | (A+B)+C=A+(B+C) |
| 分配率 | A(B+C)=(AB)+(AC) | A+(BC)=(A+B)+(A+C) |
| 恒等 | A1=A | A+0=A |
| 补 | A(A’)=0 | A+(A’)=1 |
| 德·摩根定律 | (AB)‘=A’OR’B’ | (A+B)‘=A’B’ |
德·摩根定律:
这个定律声明,对两个变量的与操作的结果进行非操作,等于对每个变量进行非操作后再对他们进行或操作。
也就是说对与门的输出求逆,等价于先对每个信号求逆,然后再把他们传入或门
(AB)‘=A’+B’
这个定律的第二部分是,对两个变量的或操作的结果进行非操作,等于对每个变量进行非操作后在对它们进行与操作。
就是对或门的输出求逆,等价于先对每个信号求逆,在把他们传入到与门:
(A+B)‘=A’B’
在数字电路中,常用的组合逻辑电路有加法器、编码器、译码器等,这里主要介绍加法器
计算机能执行的最基本运算就是把两个数相加。那么是如何通过组合电路来实现的呢?这就是本篇重点呀~。
与所有计数系统中的加法一样,对两个二进制数求和的结果可能产生进位值。二进制中,1+1=10.计算两个数位并生成正确进位的电路叫半加器。
加法器:对二进制执行加法运算的电路
半加器:计算两个数位并生成正确进位的电路
全加器:计算两个数位的和。并考虑进位输入的电路
求二进制A和B的的所有可能,真值表如下:
| A | B | 和 | 进位 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 |
注意:1+1=10 (二进制就是2用10表示,单个门电路只输出1位,所以和为0,进位为1)
如果把和与进位列同各种门的输出作比较,会发现~——和对应异或门,进位对应与门
于是此半加器表示如下:

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
布尔表达式如下:
和=A⊕B(异或门)
进位=AB (与门)
异或门真值表
| A | B | X |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
注意:半加器不会把进位(进位输入)考虑在计算之内,所以半加器智能计算两个位数的和,而不能计算两个多位二进制数的和。

计算01+01的和,表示如下 (低位和低位相加,高位和高位相加。上高下底。)

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
现在这个值就不对了呀!下面得到的值没有传给上面。即无法接受进位。

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
全加:实现两个一位二进制数相加,且考虑来自低位的进位。

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
可以用两个半加器构造一个全加器。求和的输入必须是进位输入以及两个输入值的和。也就是说,把从半加器得到的和与进位输入相加。

上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
分析一下值哈(具体电路没必要了),这个电路有3个输入,即原始的数位A和B以及进位输入Ci。因此此真值表有8行(3个输入 23=8,有问题吗?没有问题)
| A | B | Ci | Y | Co |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
最后简化公式。无视就行
Y=(A⊕B)⊕Ci
Co=AB+Ci(A⊕B)


上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
8个全加器组合起来就可以计算8位的二进运算了哦~ 8位二进制就是1字节了~。
两个八位值相加,需要复制8次全加器电路。一个位值得输出将作用于下一个位值得进位输入。最右边的进位输入是0,最左边的进位输出将被舍弃(通常会生成溢出错误,必然的,我就8个加法器也就能显示8位,到第9位可不就是超了~)
参考资料
- 编程前你最好了解的基本硬件和计算机基础知识(数字电路) https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d
- 《计算机科学概论 第5版》
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0
我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排
我想为名字验证编写一个正则表达式。正则表达式应包括所有字母(拉丁/法语/德语字符等)。但是我想从中排除数字并允许-。所以基本上它是\w(减)数(加)-。请帮忙。 最佳答案 ^[\p{L}-]+$\p{L}匹配anykindofletterfromanylanguage. 关于ruby-on-rails-rails中的正则表达式匹配[\w]和"-"但不匹配数字,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
在我的应用程序中,我有一个文本字段,用户可以在其中输入类似这样的内容"1,2,3,4"存储到数据库中。现在,当我想使用内部数字时,我有两个选择:"1,2,3,4".split(',')或string.scan(/\d+/)do|x|a两种方式我都得到一个像这样的数组["1","2","3","4"]然后我可以通过在每个数字上调用to_i来使用这些数字。有没有更好的方法可以转换"1,2,3"to[1,2,3]andnot["1","2","3"] 最佳答案 str.split(",").map{|i|i.to_i}但是这个想法对你来说
我有一个随机大小的散列,它可能有类似"100"的值,我想将其转换为整数。我知道我可以使用value.to_iifvalue.to_i.to_s==value来做到这一点,但我不确定我将如何在我的散列中递归地做到这一点,考虑到一个值可以是一个字符串,或一个数组(哈希或字符串),或另一个哈希。 最佳答案 这是一个非常简单的递归实现(尽管必须同时处理数组和散列会增加一些技巧)。deffixnumifyobjifobj.respond_to?:to_i#IfwecancastittoaFixnum,doit.obj.to_ielsifobj
什么是测试格式验证的最佳方法让我们说一个用户名,使用字母数字的正则表达式,但不是纯数字?我一直在我的模型中使用以下验证validates:username,:format=>{:with=>/^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i}数字用户名(例如“342”)通过了验证,这是我不想要的。 最佳答案 您想“向前看”一封信:/\A(?=.*[a-z])[a-z\d]+\Z/i 关于ruby-on-rails-Rails格式验证——字母数字,但不是纯数字,我们在Sta