一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
以下内容参考书籍 《编码:隐匿在计算机软硬件背后的语言》
简单的电路图先复习一下
这是串联。从示意图中我们可以看出,如果两个开关有一个没有关上,那么灯就不会亮。
这是并联。从示意图中我们可以看出,只要有一个开关关上了,灯就会亮。
这是继电器。如果你学过物理,应该知道电生磁。简而言之,就是如果在一个铁柱上缠绕上一圈又一圈的电线,接通电源后,铁柱就会产生磁性。这个示意图中,当接通电源后,磁铁产生吸力,就把上面的含铁开关给吸下来了,接通了上面的电路。
这个东西有意思的点就在于,你可以通过一个开关去控制另一个开关的状态。你可以选择让右边的电路在被吸住时连接,也可以让右边的电路被吸住时断开。可以改变原来电路的结果。
从一个不需要进位的加法器说起
上篇文章中,提到,现在的 0 和 1 代表的分别是 低电压和高电压。
但是由于我不太懂硬件,不晓得具体是怎么实现的,所以这篇文章的 1 和 0 ,就对应电路图上的 连接 和 断开。
做事嘛,从简单到难。我们先设定一个小目标,设置不进位。即,相加的双方结果不能大于1 。
就是说,两个加数开关的状态,最多只能开一个。
假设计算如下内容:
假设咱们的输入和输出都有四个小灯泡。
1 0 0 1 ----------- A
+ 1 1 0 ----------- B
____________
1 1 1 1 ----------- C
那如果把它转化成亮灯目标描述,就是。
数字为 1 的灯都得亮。即,我们输入的时候,闭合开关,灯得凉。输入完成后,对应的结果灯得亮起来。(后面的字符代表着电路图中灯的位置)
图比较粗糙,大家将就着看,实际输入位置,A 和 B 肯定是不呆在一块的。但是我相信,电线是可以随便绕的,所以电路图上的位置无所谓。
在这样一个简单的结合了串联和并联的电路图中,我们就实现了,不进位的加法算法。
即,A 和 B 只有有一个 开了,电路接通,结果就是亮的。即 1 + 0 = 1;0 + 0 = 0;
符合结果。
但是如果你非要使用 1 + 1 呢? 那就涉及到进位了,这个电路图是实现不了滴。那我们接着来完成一个可以进位的二进制加法运算器吧。
真正的二进制加法器实现
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
如果允许进位,那么问题的变成了:
每一列的输入可以转化为两个:上一列的进位 加上 当前列的结果。
首先我们来拿到 无进位 相加的结果。
此处简述以下逻辑门的概念。
或,只有一个开关闭合了(用1指代),灯就可以亮起来,参考并联。
与,必须两个两个开关都闭合,灯才可以亮起来,参考串联。
与非门,结果和 与门 相反,可以使用串联加继电器实现。
或非门,结果和 或门 相反,可以使用并联加继电器实现。
我们可以发现,活门和与非门相与,正好能得到我们想到的结果。
可以组合电路如下:
其实这个 A 和 B 只有一个输入 1 的时候,结果是 1 ,有一个专门的名词,叫做
异或门
这个地方的异或,是我们上一步的抽象结果。我们不需要关注具体的实现内容,只要有输入和输出,就可以作为一个功能模块来使用。我们把当前的模块进一步抽象为一个大模块:
到了现在这一步,我们还缺一个进位输入。
我们进一步组合:
我们再一次抽象。
最终,我们会得到这样一个元件。
我们将这样的原件组合8 次,至此,一个简单的二进制加法器就算是完成了。
结语
虽然这些是电路,但是有些思想却是通用的,抽象抽象再抽象,将问题分割,最后要解决的问题就变得相对简单。
有了第一个二进制加法器,我们就可以有第二个。
有了加法,我们就可以组合乘法。
这些东西虽然和编程关系不大,但是了解计算机的基础组成,能够消除我们对于计算机的恐惧,激发我们对计算机的兴趣,也能触碰到前人的设计思维。总而言之,我感觉非常有意思。
本文实现的,是最初的计算机设想,并非当今计算机的真正组成。尽管如此,中心思想却是不变的。
如果这边文章对你有帮助,记得给我点赞~