从0开始认识1个CPU

第一部分 预备知识

Chapter 0 预备知识

§ 0.1 布尔逻辑与逻辑门

(一)

我们将进入一段“抽象”的旅程。忽略底层细节,构造更复杂的系统。

只用开/关两种状态也可以表示信息,这叫二进制,意思是“用两种状态表示”。就像自行车有两个轮子。

你可能觉得两个状态太少了,没错,你是对的。但是如果只需要表示truefalse,两个值就够了。

电路闭合,电流流过,代表;电路断开,无电流流过,代表

二进制也可以写成10而不是true和false,只是不同的表示方式罢了。

晶体管的确可以不只是开/关,还可以让不同大小的电流通过,一些早期计算机是三进制甚至五进制的,问题是,状态越多,越难区分信号,如果附近有人在用电子产品,就会干扰信号,而让状态数量最少,就可以尽可能解决这类问题。

另一个计算机使用二进制的原因是:有一整个数学分支存在,专门处理true和false。它已经解决了所有法则和运算,叫做“布尔代数”。

(二)

布尔代数中有三个基本操作:notandor。这些基本操作非常有用,我们一个一个来看。

  1. not操作把布尔值反转。把true进行not操作会变成false,反之亦然。我们可以写出如表1-1的真值表。此处不展开not门的具体实现,读者可以自行查找资料了解。
输入输出
truefalse
falsetrue
  • 表1-1 not操作真值表

  • and操作有2个输入1个输出,仅当两个输入都为true时,结果才为true,否则为false。实现and操作很简单,两个开关串联,只有都打开的时候才有电流流过(左端一直有电),此处不再赘述。

输入1输入2输出
truetruetrue
falsetruefalse
truefalsefalse
falsefalsefalse
  • 表1-2 and操作真值表

  • or操作和and操作一样,有2个输入和1个输出。只要两个里至少有一个是true,结果就是true。只有两个输入都是false时,结果才为false。实现方法,只要把上面的and门的串联改成并联即可。

输入1输入2输出
truetruetrue
falsetruetrue
truefalsetrue
falsefalsefalse
  • 表1-3 and操作真值表

现在,我们可以进行一次抽象。not门的画法是三角形前面(尖头朝向的地方)画一个圆圈,and门用一个稍宽的D表示,or门用一个飞船一样的图形表示。除此以外,还有一个操作叫做异或(Exclusive or, xor)。

输入1输入2输出
truetruefalse
falsetruetrue
truefalsetrue
falsefalsefalse
  • 表1-4 xor操作真值表

  • xor就像普通or,但是当两个输入均为true时,结果为false。具体实现以及如何表示可以参考图1-5。

§ 0.2 二进制,以及衍生物

(一) 二进制的原理,加法

上一节中,我们提到用0和1可以表示两个数,但如果只有两个数,我们怎么表达更多东西?

答案也很简单,用多个二进制值即可。和我们熟悉的十进制一样,十进制只有0~9这10个数码,要表示大于9的数,加一位就行了。二进制也可以这么想,拿(263)10(263)10来想,这个数字“实际”代表了什么?2个100,6个10,3个1,加在一起,就是263。

100的个数10的个数1的个数
263

注意每一列有不同的乘数,100,10和1。每个数都是右边的10倍。因为每列有10个可能的数字(0~9),所以叫做十进制。二进制是这个名字,是因为它只有两个可能的数0和1,这意味着每个乘数必须是右边的两倍,即...,4,2,1。拿(101)2(101)2来举例。这意味着它有1个4和1个1,但只有0个(没有)2。为了表达更大的数,二进制需要更多位。拿(10110111)2(10110111)2来举例,用相同的方法,转成10进制。它有1个128,1个32,1个16,1个4,1个2,1个1,加起来即为183。

二进制的加法也不难。只需要记住1+1=10,1要进位。此处不再赘述。

(二)从Byte到GB

二进制中,1个1或0叫做1“”或1“比特”。上个例子我们用了8位,8位能表示的最小数是0(暂不考虑负数),这时8位都是0;最大数是255,这时8位都是1。8位是如此常见,以至于有专门的名字:字节。如果你有10字节,说明你有80位。

你肯定听过KB,MB,GB,不同前缀表示不同数量级。K(Kilo)表示1000,M(Mega)表示100万,G(Giga)表示10亿。

等等,我们还有另一种计算方法,二进制里,2的10次方是1024,这意味着偏好二进制的计算机科学家可能会使用1024作为字节和KB的进率,因此1KB也可以等于1024字节,1MB等于1048576字节,1GB等于1073741824字节。

(三)整数和浮点数的表示

正整数的表示已经在第一部分中说过。但是不是所有数字都是正数,我们也需要表示负数。大部分计算机用第一位表示正负。1说明是负数,0说明是正数,这被称为”符号位“,用剩下的31(63)位来表示数字。

但如果我们要读小数呢?比如3.14或1.414。这种类型的数叫做浮点数,因为小数点可以在数字间浮动。有很多种办法表示浮点数,最常见的是IEEE 754标准。它用类似科学计数法的方法来存十进制值。例如,625.9等于0.6259×1030.6259×103。这里的6259叫有效数位,3是指数。

在32位浮点数中,一般使用第1位表示数的正负,接下来8位存指数,剩下23位存有效数位。

(四)ASCII和Unicode

上面的方法可以用来存储数字,但如果你要存储“Home”这个单词呢?

最简单的方法,就是给字母编号,A是1,B是2,C是3,以此类推。5个比特,可以存32个可能值,这对26个字母够了,但不能存数字、大小写和标点符号。ASCII(美国信息交换标准代码)发明于1963年,是7位代码,足够存下128个不同值。

范围扩大以后,就可以表示大小写字母,数字和标点符号以及@这样的符号。但有个限制:它是为英语设计的。如果碰到中文这样几千个甚至更多的文字,这远远不够。

为了解决这个问题,每个国家都发明了多字节编码方案,但不互相兼容。所以Unicode诞生了——统一所有编码的标准。Unicode设计于1992年,解决了不同国家不同标准的问题。最常见的Unicode是16位的,可以存超过65000个位置,对于大部分语言来说这已经足够了。

你的QQ信息,这篇文章,互联网上的每个网页,甚至你的操作系统,只不过是一串1和0。下一章,我们会聊计算机怎么操作二进制,初尝计算的滋味。   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值