首页 > 代码库 > 为什么计算机能读懂 1 和 0 ?

为什么计算机能读懂 1 和 0 ?

问题:为什么计算机能读懂 1 和 0 ?

  从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理

  回答:

  萧井陌,私信问题不回,请提问邀请

  玉来了

  既然是问最最原始的那个工作原理。。。

  从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理

  +++理论的分割线+++

  最最基本原始的那个工作原理甚至都和电无关,是数学原理,布尔代数(搜索),任何可以改变状态传递信息的技术都可以拿来实现布尔逻辑,而实现了布尔逻辑,就离计算机不远了。

  像是三体里面的人列计算机,就是用三体人实现计算机,这一段我直接跳了,没什么可看的,因为我懂嘛。。。

  我还设想过水流+开关实现逻辑门,是可行的。

  「现在可以公开的情报」

  计算机的理论基础是布尔代数

  计算机的实现基础可以是任何拥有『改变状态』和『传递信息』的技术

  +++基础实现的分割线+++

  继续正题。。。

  起初, 科学家 创造计算机, 科学家 说,要先有逻辑门,然后就用真空二极管实现了逻辑门

  真空管的原理去搜吧

  电子计算机的原理就是利用通电、断电(或曰高电平低电平)这两个状态来表示布尔代数中的逻辑真和逻辑假从而实现布尔运算,由于这个原因,设逻辑真为1和逻辑假为0,这样就可以用计算机表示二进制的数字了。

  现在的计算机用的是晶体二极管,虽然底层原理不同,但是性质是一样的,这就是编程中常说的封装和抽象的好处,你不需要关心它的原理,用它实现你的功能就行了。

  所以说起来,现代电子计算机的实现,是物理原理,计算理论,是数学原理。

  二极管的性质是这样的,只有一个方向可以通电,反向不通电

  『想知道具体原理的可以搜索PN结』

  还有三极管(还有一种性质相似的场效应管FET),性质是这样的,b通电ec通,b断电ec断

  『具体原理搜索NPN结』

  【【【【配图】】】】

  二极管和三极管

技术分享

  然后可以组成逻辑电路,下面分别是与或非(AND、OR、NOT)三种逻辑门的电路实现

  【【【【配图】】】】

  从左到右分别是与或非三种门,x j表示输入,m表示输出

技术分享

  有了这三种逻辑门电路,你就可以实现任意逻辑门了,比如与非门、或非门、异或门、同或门(异或非门)。(搜索逻辑门)

  (实际应用中,是以与非门(NAND(Not AND) gate)为基础原件来构建电路,因为其他所有门电路都可以用与非门构建,关于这一点,你可以思考一下)

  「现在可以公开的情报」

  地球当代的计算机的实现基础是电子技术

  二极管和FET的技术原理是PN结和NPN结,是原子、电子层面的原理(很底层吧。。。)

  用二极管和FET可以实现布尔代数中的逻辑操作,称为『逻辑门』

  +++逻辑的分割线+++

  二进制数字的加法如下:

  1+1=10

  1+0=1

  0+0=0

  0+1=1

  用上文中的逻辑门就可以实现这个加法。

  不考虑进位的情况下(术语叫半加器),用一个异或门就可以实现两个数字相加,很简单,就不画图示意了,自行思考吧。。。

  考虑进位的情况下(术语叫全加器),稍微有点复杂,输入通过XOR(异或门)得到结果,同时过一个电路得到进位结果

  进位规则如下:

  1+1进位1

  1+0进位0

  0+0进位0

  0+1进位0

  可见进位规则可以用AND(与门)得到结果,所以电路图如下:

  【【【【配图】】】】

技术分享

  把这样的电路串起来,就可以实现多位加法,自己想想看吧。

  不过这里有一个问题,要连多个例图中的加法器,需要给电路添加一个输入口m,它是上一位的进位,有兴趣可以思考一二。

  实际应用中,电路并不是凭空想的,是通过布尔逻辑运算得到一个最简逻辑表达式,然后按照这个表达式来组装电路,『请搜索数字电路』。

  淘宝可以买到LED灯、二极管和三极管,虽然现在涨价了,但价格依旧感人,不到顺丰快递费就可以买一大把,有兴趣的同学可以自行购买这些元器件组装电路来玩玩。

  输出端接上led灯,就可以观察到电路运行结果。

  额外的,如果你把几个灯泡并联并且弄成一条线段的样子当做一个整体灯管,然后通过输入来点亮相应灯泡,就可以用来显示数字了。。

  像下面这种,一共7个灯管

  1点亮右边两根、2点亮相应的,以此类推

  这样可以用布尔代数做出来5个输入7个输出相对应的逻辑,然后用上文的逻辑门组成电路图实现

  (为啥输入是5个?)

技术分享

  「现在可以公开的情报」

  可以用逻辑门实现加法,也可以实现减法

  实现加法的原理在于通过输入进行逻辑运算得到输出,这一学科可以通过搜索『数字电子技术』获得详情

  通过灯泡等设备,可以实现电路的输出

  计算机的本质原理就是接受『输入』,通过『计算』,得到『输出』

  通过上文所有文字,已经部分解决了楼主计算机为什么能读懂1和0以及内部工作原理的问题,虽然还剩下时序逻辑,不过这已经够了。楼主赶紧点赞吧

  +++分割线+++

  太长了。。。

  后续还有反馈电路、触发器、时序逻辑存储器等等等等,最终目标是弄出一个CPU来(如果我有时间的话)可以写一个模拟器让感兴趣的同学用逻辑门拼凑CPU(如果我还有时间的话)

  胡越

  这个问题,我必须回答一下,作为一个cs专业的学生。。。我到大二其实都不是很清楚,直到我遇到了一本神作。。。 我一口气读完,有句话我终于领悟了:朝闻道,夕死无憾!

  闲话不多讲,有一本神作!绝对的神作!Charles Petzold的《Code》,这本书可以说,下至5岁孩童,上至90岁老妪,无论你是计算机小白,还是大神,都会从这本书中有所收获。真是后悔没早点看到这本书,让我一个无比讨厌自己专业的人,都开始热爱这个伟大的创造,你说你还在等啥!!赶紧去图书馆借去!!!!立刻!!!马上!!!!

  ps:如果你真正想了解计算机的原理的话。。。我觉得没人能比这本书讲的更通俗了

  ps2:如果你想继续了解的话,王爽老师的《汇编语言》,还有一本《深入理解计算机系统》,我相信你会喜欢。

  笃木行知

  一般来说,问这个问题的和来参考的人肯定是完全没有学习相关课程的。所以我尽可能简单的从最基础的开始。请听我慢慢道来。

  1.计算机怎么认识0和1的?

  首先你应该听过二极管是什么,这是逻辑电路中最常见的电子器件。

  额。。。又扯上“逻辑电路”了:逻辑电路是以二进制为原理、实现数字信号逻辑运算和操作的电路。

  要想短短几百字说清楚还真难。不过,这里就看到“二进制”了,二进制就是问题中提到的0和1!而在实际电路中,0和1由低电平(低电压)和高电平(高电压)实现。非高即低,很容易实现。

  回到逻辑电路,怎么用逻辑电路实现我们想要的一些功能呢?(这些简单功能就是计算机的基础,各项简单功能组合起来就能实现复杂的功能!)

  首先,二极管具有单向导电性(原理就不说了,一下子很难懂的)。

技术分享

  好,这个你先记住,把二极管看做一个箭头,电流只沿箭头方向走。然后,给你举个例子。如果有个决定,你和你朋友只有两个人都同意时才去执行。回到初中物理知识。

技术分享

  给你控制开关一,给你朋友控制开关二,都同意时才会把两个开关都放下,使电路导通,灯泡点亮。这就是一个简单的“与逻辑”。当然复杂的电路中并不是人去控制开关的,所以得用二极管来实现。下面这个电路实现的是同一个功能。(画图神马的最折腾人了。。。)

技术分享

  当A,B都为高电平时(所谓的1),电源VCC的电流是不能通过D1,D2两个二极管的(电流只能从高电压处流到低电压处)。所以电流只能流向L点,如果在L点接个电灯泡(实际上是发光二级管),就会被点亮了。

  还得继续解释,如果A,B中只要有一个为低电平(所谓的0),电流就可以通过了,就不会流向L点了,灯泡就不会亮了(为什么,想象一下电流为水流,导线为水管,而D1,D2处的管子是很粗的(几乎没电阻)!水流过不会有阻碍。而L处的水管是很细的(因为接了电灯泡,有电阻),水流很难流过,即使通过也是很小的水流(电流),不足以点亮灯泡。更确切的应该用电压去解释,能力有限,只能这么玩了。)

  所以这个简单的电路就能实现一个简单的功能,而且电路能够识别1和0了!

  2.计算机能用1和0做什么?

  除了与门,逻辑电路中还有常见的或门,非门,或非门,与或非门等。(其中有些还要用到三极管,原理就跟上面大同小异了,只要了解的童鞋就不用管了)。

  与门在电路图中的符号:

技术分享

  当A=1,B=1时,L=1;(1代表高电平,0代表低电平)

  当A=1,B=0时,L=0;

  当A=0,B=1时,L=0;

  当A=0,B=0时,L=0;

  或门在电路图中的符号:

技术分享

  当A=1,B=1时,L=1;

  当A=1,B=0时,L=1;

  当A=0,B=1时,L=1;

  当A=0,B=0时,L=0;

  非门在电路图中的符号:

技术分享

  当A=1时,L=0;

  当A=0时,L=1;

  然后我们就可以用这些门电路相互组合去实现复杂的逻辑功能了。

  好,有了上面这些知识,下面来个实用的:计算机怎么做加法的?

技术分享
技术分享

  就是上面那个电路就可以实现两位二进制数的加法了。容易扩展为更多位的加法运算,然后依次类推,可以用门电路实现减法,乘法和除法等。这样,不说是计算机,计算器的模型总出来了吧。

  白一涛,物流专业学生

  抛砖引玉

  计算机是用数字电路组成的,而数字电路中有0和1两种状态,所以计算机只能读懂0和1。

  而数字电路有高电平和低电平两个状态,被识别为0和1而已。

  王法,鸟是好鸟,就是话多

  一个快速的完全针对问题的回答是,0是逻辑低,代表电平接地,1是逻辑高,代表电平接电源(3.3V或5V)。计算机其实不懂0和1,它只是根据程序员和电子工程师预先写好的程序,对用户的输入一一做出回应。

  打个比方,各地政府都对一些紧急事务做了“应急预案”,一旦事件发端,政府工作人员就可以快速按预案的流程处理事务。这个“应急预案”就类比于程序,工作人员并不需要学会思考和判断,只需要按照预案一一操作即可,决策的工作交由制作预案的人,也就类比于程序员,来完成了。

  如果要详细回答,用户的指令,是如何转化成计算机可读入的机器码(0和1),计算机又是如何将得到的正确答案反馈给用户的,即CPU到底是如何工作的,这可能需要一个稍微长一点的回答:

  事先做个声明,为了保证行文的流畅性和易读性,有很多相似的概念被刻意做了模糊化处理,包括但不限于场效应管与三极管,不同掺杂方式的场效应管,不同的逻辑门, 不同的触发器,不同的计算机体系结构,不同的存储器类型,所以计算机实际的运行方式与我的回答可能会大相径庭,但背后的基本概念和思维方式应该是一致的。

  1场效应管

  现代数字电路的基础是场效应管(模拟电子的基础是三极管),场效应管的基本机构是长这样的

技术分享

  蓝色部分平时处于绝缘的状态,此时源级(Source)和漏级(Drain)是不通的,电流不能从中间流过。当栅极(Gate)有电压时,一部分蓝色区域变成导体,源级和漏级就被打通了。这种材料可以表现出导体和绝缘体的两种特性,所以我们称之为半导体。由此我们获得了一个类似于开关的东西,可以通过是否给栅极电压,来控制电路导通与否,符号化地,我们将之表示为:

技术分享

  2逻辑门

  当我们已经拥有了场效应管,我们就可以以此为基础搭建基本的逻辑门,即 非门,与门,或门。我们来看一个简单的或门的实现(非门的实现已经有很多答案提到了):

技术分享

  或门要求,当输入的a和b任一等于1,输出就为1。如果a和b均为0.,则输出为0.

  ————————————————原理简介,可跳过————————————————————

  假设现在a为1,b为0,此时a控制的场效应管的栅极有了电压,这个管子被打通了,这个场效应管的漏极直接与地(即低电平)相接,它的漏极又形成了输出F的场效应管的栅极输入,因为场效应管F的栅极没有电压,处于截止状态,输出F上拉到电源电压Vcc(高电压),输出1。

  我们接下来考察当ab输入均为0的情况。此时ab两个管子都处于截止状态,F管的栅极会上拉到Vcc,F管会被导通,于是输出F与地直接相连,F为低电平0.

  ————————————————————————————————————————————

  相似地,我们可以构建其他基本逻辑门,并以非门,与门,或门为基础,构建或非,异或,同或,与非门等复杂一点的逻辑门。

技术分享

  3.1触发器

  有了基本的逻辑门,我们如果把1对应真,0对应假,我们已经可以进行基本的逻辑决策了。但在实际情况中,我们做出一个决策,并不仅仅依赖于当前的输入,还依赖于之前的状态,因此我们需要构建带有记忆功能的逻辑组件,即触发器,看一个最简单的RS触发器:

技术分享

  它的真值表为

技术分享

  ——————————————原理简介,可跳过——————————————————————

  当RS均为0,触发器的两个输入为1(输入是RS取反),当Q为1时,下面的与非门的两个输入都是1,因此输出为0,上面的与非门输入为1和0,输出是1,因此Q保持1。当Q为0时,下面的与非门两个输入为1和0,以为内输出为1,上面的与非门输入为两个1,因为输出为0,因此Q保持0。

  所以当RS为0时,Q输出与前一状态相同。

  类似地,我们可以推到其他3种状态,得到上面的真值表。

  ————————————————————————————————————————————

  我们可以看出,触发器的前一输出会影响到触发器后一输出。所以在某种意义上,我们称它具有记忆功能。触发器将会是构成状态机(控制单元)的重要基础组件。但为了对CPU的工作原理有更加全面的认识,我们暂时把目光从逻辑控制单元上移开,转向另外一个重要单元,计算单元。

  3.2半加器和全加器

  我们还是以逻辑门为基础。我们考察异或门的真值表:

技术分享

  我们发现,这恰恰就是二进制加法当前位的结果。

  0+0等于0,0+1等于1,1+1等于0(因为产生了进位),因此我们很容易地想到,可以用异或门构造一个加法器(半加器):

技术分享

  S为当前位的结果,C为进位,当且仅当AB都为1时,产生一个进位1。

  当然我们做加法时,是不能不考虑进位的,之前的半加器是不够完备的,一个完整的加法器(全加器)是这样的:

技术分享

  低一位的进位,和当前位的两个加数,共同决定输出。

  好了,我们有了最基本的运算单位,加法运算单位。减法运算单位与之类似。从某种意义上讲,乘法运算可以看做是次数为被乘数的加法运算,除法可以看做是次数是被除数的减法运算,因为也可以用类似的方法实现(现代数字电路中,为了加快运算速度,已经不采用这种方法了,而是类似于我们用笔算乘法的逻辑,只不过是从10进制变成了2进制)。

  这些数学运算单位,可以构成CPU的另一重要组件,计算单元。但仅仅有控制单元和计算单元并不足以组成CPU,我们还需要存储单元。

  3.3静态随机存取存储器

  不同的存储器的基本原理差别很大,有五花八门的存储器基于不同的单位成本,读取速度,是否需要上电保持来供计算机不同的应用进行选择,一一介绍冗长而又无趣,为了简单起见,仅介绍一种基于场效应管的存储器,静态随机存储器:

技术分享

  原理介绍我直接摘取了维基百科的内容,一如既往地,可以快速跳过以保持阅读的流畅性。

  ——————————————原理简介,可跳过——————————————————————

  准备:

  如果字线没有被选为高电平, 那么作为控制用的M5与M6两个晶体管处于断路,把基本单元与位线隔离。由M1 – M4组成的两个反相器继续保持其状态,只要保持与高、低电平的连接。

  读取:

  假定储存的内容为1, 即在Q处的电平为高. 读取周期开始时,两条位线预充值为逻辑1, 随后字线WL充高电平,使得两个访问控制晶体管M5与M6通路。第二步是保存在Q的值与位线BL的预充值相同,所以BL保持逻辑1,而Q与BL的预充值不同,使得BL经由M1与M5放电而变成逻辑0(即Q的高电平使得晶体管M1通路). 在位线BL一侧,晶体管M4与M6通路,把位线连接到VDD所代表的逻辑1 (M4作为P沟道场效应管,由于栅极加了Q的低电平而M4通路). 如果储存的内容为0, 相反的电路状态将会使BL为1而BL为0. 只需要BL与BL有一个很小的电位差,读取的放大电路将会辨识出哪条位线是1哪条是0. 敏感度越高,读取速度越快。

  写入:

  写入周期开始时,把要写入的状态加载到位线。如果要写入0,则设置BL为1且BL为0。随后字线WL加载为高电平,位线的状态被载入SRAM的基本单元。这是通过位线输入驱动能力设计的比基本单元相对较弱的晶体管更为强壮,使得位线状态可以覆盖基本单元交叉耦合的反相器的以前的状态。

  ————————————————————————————————————————————

  4 冯·诺依曼结构

  我们在3.1中讨论过的触发器可以进一步构成状态机,例如我们可以用两个按钮和一个RS触发器控制一个电机。当按钮为01时,控制电机正转,按钮为10时,控制电机反转,按钮为00时,控制电机保持现有方向不动。此时这个控制组件就是状态机。通过它,我们可以实现面对特定的用户输入,机器可以自动做出对应的输出。状态机将构成CPU中的控制单元。

  从3.2中我们获得了一个计算单元。

  从3.3中我们获得了一个存储单元。

  加上我们最熟悉的输入设备(鼠标,键盘)和输出设备(屏幕,音响),我们现在已经足够搭建一个典型的冯诺依曼结构的计算机了:

技术分享

  连接各个单元的是总线,数据和命令都以01二进制码的形式,通过总线奔跑在各个单元之间。每当用户输入一个命令时(点击一下鼠标或者敲击一下键盘),控制单元会接受这个命令,根据程序员已经写好的决策方式(程序),决定从存储器调用历史数据,并将数据放入运算器中运算,最后的结果会在输出设备上得到展现。

  但是我们之前对于状态机的讨论中我们知道,控制器只能接受0和1的控制命令,意味着程序员写程序时,需要挨个给每个状态机的输入变量和初始变量赋予0或1,因此写程序会变成不断敲击0和1的一件事。这无疑是十分反人类的,我们需要更加接近自然语言的程序语言。

  5汇编语言

  我们讨论一种最简单的机器语言,如果我们用10110 来代表数据移动的操作(X86),某一个寄存器AL的编码是000,那么向AL写入61(二进制为01100001)这个数这个操作,程序员需要这样写:

  10110000 01100001

  于是我们尝试,把10110 翻译成MOVE,把000翻译成AL,这样代码就变成:

  MOVE AL,01100001

  这种用自然语言翻译之后的语言,就是汇编语言。汇编语言是用自然语言对机器码的一一翻译。以便于阅读和编写。

  6高级语言

  汇编语言当然比机器语言的可读性和可编写性都好上不少,但无疑还是十分让人蛋疼的,计算机科学家们又发明了诸如C语言等高级语言,它们的语法更加符合人的逻辑思维模式,而不是计算机的。编译器负责将这些高级语言,翻译成汇编语言,再翻译成机器语言。

  基于C语言或者JAVA这种编程语言,还有一些更加友好的可读性强的脚本语言,例如WEB前端的Javascript,当然这些成熟的高级语言的区别将是一个繁复并超出我的能力范围的讨论,不展开了。天才的程序员们用这些语言,为我们编织了一个光怪陆奇又精彩纷呈的互联网世界。

  最后的话:

  在整个电子工业中,封装和复用的思想都贯穿其中,通过封装底层模块,让上一层的工程师不需要将精力花在冗长复杂的底层物理实现上,可以专注于自己算法和逻辑的推进。由于现代电子工业的快速发展,计算机计算能力的冗余越来越多,我们越来越不需要去关心底层封装的具体结构。当然了,对于一部分异常关注计算性能的方向,例如并行计算(计算量巨大)和嵌入式设计(有时微处理器计算能力有限),适当地关注底层逻辑实现,对编写更加高效的代码十分有帮助。

为什么计算机能读懂 1 和 0 ?