不会吧,你不会不知道二进制加法器要怎么做吧?

226 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

以下内容参考书籍 《编码:隐匿在计算机软硬件背后的语言》

简单的电路图先复习一下

这是串联。从示意图中我们可以看出,如果两个开关有一个没有关上,那么灯就不会亮。

1.png


这是并联。从示意图中我们可以看出,只要有一个开关关上了,灯就会亮。

2.png


这是继电器。如果你学过物理,应该知道电生磁。简而言之,就是如果在一个铁柱上缠绕上一圈又一圈的电线,接通电源后,铁柱就会产生磁性。这个示意图中,当接通电源后,磁铁产生吸力,就把上面的含铁开关给吸下来了,接通了上面的电路。

这个东西有意思的点就在于,你可以通过一个开关去控制另一个开关的状态。你可以选择让右边的电路在被吸住时连接,也可以让右边的电路被吸住时断开。可以改变原来电路的结果。

3.png

4.png

从一个不需要进位的加法器说起

上篇文章中,提到,现在的 0 和 1 代表的分别是 低电压和高电压。

但是由于我不太懂硬件,不晓得具体是怎么实现的,所以这篇文章的 1 和 0 ,就对应电路图上的 连接 和 断开。

做事嘛,从简单到难。我们先设定一个小目标,设置不进位。即,相加的双方结果不能大于1 。

就是说,两个加数开关的状态,最多只能开一个。

假设计算如下内容:

假设咱们的输入和输出都有四个小灯泡。

  1 0 0 1 ----------- A
+   1 1 0 ----------- B
____________
   1 1 1 1 ----------- C

那如果把它转化成亮灯目标描述,就是。

数字为 1 的灯都得亮。即,我们输入的时候,闭合开关,灯得凉。输入完成后,对应的结果灯得亮起来。(后面的字符代表着电路图中灯的位置)

5.jpg

图比较粗糙,大家将就着看,实际输入位置,A 和 B 肯定是不呆在一块的。但是我相信,电线是可以随便绕的,所以电路图上的位置无所谓。

在这样一个简单的结合了串联和并联的电路图中,我们就实现了,不进位的加法算法。

即,A 和 B 只有有一个 开了,电路接通,结果就是亮的。即 1 + 0 = 1;0 + 0 = 0;

符合结果。

但是如果你非要使用 1 + 1 呢? 那就涉及到进位了,这个电路图是实现不了滴。那我们接着来完成一个可以进位的二进制加法运算器吧。

真正的二进制加法器实现

6.png

  0 1 1 0 0 1 0 1
+ 1 0 1 1 0 1 1 0
_____________________
1 0 0 0 1 1 0 1 1

如果允许进位,那么问题的变成了:

每一列的输入可以转化为两个:上一列的进位 加上 当前列的结果。

7.png

首先我们来拿到 无进位 相加的结果。

此处简述以下逻辑门的概念。

或,只有一个开关闭合了(用1指代),灯就可以亮起来,参考并联。

与,必须两个两个开关都闭合,灯才可以亮起来,参考串联。

与非门,结果和 与门 相反,可以使用串联加继电器实现。

或非门,结果和 或门 相反,可以使用并联加继电器实现。

8.png 我们可以发现,活门和与非门相与,正好能得到我们想到的结果。

可以组合电路如下:

9.png

其实这个 A 和 B 只有一个输入 1 的时候,结果是 1 ,有一个专门的名词,叫做 异或门

10.png

这个地方的异或,是我们上一步的抽象结果。我们不需要关注具体的实现内容,只要有输入和输出,就可以作为一个功能模块来使用。我们把当前的模块进一步抽象为一个大模块:

11.png

到了现在这一步,我们还缺一个进位输入。

我们进一步组合:

12.png

我们再一次抽象。

13.png

最终,我们会得到这样一个元件。

14.png

我们将这样的原件组合8 次,至此,一个简单的二进制加法器就算是完成了。

结语

虽然这些是电路,但是有些思想却是通用的,抽象抽象再抽象,将问题分割,最后要解决的问题就变得相对简单。

有了第一个二进制加法器,我们就可以有第二个。

有了加法,我们就可以组合乘法。

这些东西虽然和编程关系不大,但是了解计算机的基础组成,能够消除我们对于计算机的恐惧,激发我们对计算机的兴趣,也能触碰到前人的设计思维。总而言之,我感觉非常有意思。

本文实现的,是最初的计算机设想,并非当今计算机的真正组成。尽管如此,中心思想却是不变的。

如果这边文章对你有帮助,记得给我点赞~