第2章 一切皆数

现代的二进制计数法是莱布尼兹发明的,他还给出了二进制的运算法则,但当时他自己也不清楚二进制有什么用处,所以尝试用二进制来解释圣经和中国的伏羲八卦图,他认为二进制与伏羲八卦图非常吻合,也就说八卦图可能也是一套二进制的符号系统。

十进制是满十进一,二进制是满二进一,十进制里没有10,二进制里没有2。那么,冯诺依曼为什么放着常用的十进制不用,而在计算机方案里选用二进制呢?

一个重要的原因是二进制容易在物理上实现,比如有电可以看成是1,没电可以看成是0,开关闭合可以看成1,开关断开可以看成0,阳可以看成1,阴可以看成0,只要有两种状态的事物都可以表示二进制,但十进制却需要十种状态,因此,二进制比十进制实现起来容易得多。

2.1数字的编码

任意一个数字都可以用二进制表示,如表2-1所示,就是从0开始,逢二进一,不断增加“1”和“0”的个数,那么任意一个十进制数都有一个二进制数与之相对应。

表2-1 十进制与二进制对应关系

十进制

0

1

2

3

4

5

6

7

255

二进制

0

1

10

11

100

101

110

111

11111111

上表列出了十进制整数的二进制表示方法,那么小数怎样用二进制表示呢?

小数可以用浮点数的方法表示,单精度浮点数总共占用32位,表示方法如图2-1所示,正数符号位是0,负数是1。


图2-1 单精度浮点数的表示方法

下面看一下5.125怎样用浮点数表示,首先进行如下换算(换算方法在后面的进制转换中详述):


得出指数是2,按照指数部分的计算方法需要加上127,然后转化成二进制:


最终得出:符号位是0,指数部分是10000001,小数部分是01001,不足23位补零。5.125转化成浮点数最终结果如图2-2所示。


图2-2 5.125的单精度浮点表示法

不考虑符号,单精度浮点数表示的范围是:1.401298x10-45至3.402823x1038之间。

2.2英文字符编码

计算机只能存储和处理二进制数据,任何其它信息都要转化成二进制数据才能被计算机所接受。英文字符、数字字符、标点符号和控制字符可以通过ASCII码表(美国信息交换标准码)转化成二进制,如表2-2所示。ASCII码表与莫尔斯电报码相似,都是事先约定好符号代表的含义,比如65代表“A”,97代表“a”,当然,实际存储的是65、97的二进制。

表2-2 ASCII码表


注意:“1”字符的二进制编码是00110001,而1这个数字的二进制编码是00000001,计算机只认二进制,所以都要转换成二进制。

2.3汉字编码

ASCII码表只能把英文等信息编码成二进制数据,那么汉字该怎么编码呢?

汉字编码采用区位码的方式,分成94个区,每个区94个位置,总共收录了6763个汉字和682个特殊字符。这样,任意一个汉字就有一个区码和一个位码,区码加上位码就是这个汉字的编码。

汉字的区码和位码都是1到94之间,ASCII码是0到127之间,那么汉字如果直接用区位码存储,将分不清究竟是一个汉字还是两个ASCII码字符了。实际上,汉字的区码和位码都要加上128再存储,这样一来,存储的数据如果小于128就是ASCII码字符,否则就是汉字,也就能实现中英文混排了。

2.4声音的编码

声音可以通过麦克风转化成一维的电信号,图2-3是截取的一段声音信号。


图2-3 一段声音信号的采样图

那么,我们如何将这一段电信号转化成二进制数据呢?

每隔一段时间采样一次电压值,这一段电信号共被采样了13次,因此得到13个电压值,电压值接近哪一档就按哪一档算,13个值分别是(-0.2、-0.2、0.2、0.8、0.6、-0.8、-0.6、0、0.4、0、-0.6、-0.4、0.2)。

我们可以设计-1.0~1.0共11个数用如表2-3所示的二进制编码代表。

表2-3 电压值与二进制编码的对应关系

电压值

-1.0

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1.0

二进制

1011

1100

1101

1110

1111

0

0001

0010

0011

0100

0101

这样一来,13个数就编码为(1111、1111、0001、0100、0011、1100、1101、0000、0010、0000、1101、1110、0001),有了二进制数,这一段声音就能被计算机存储和处理了。

现在存在两个问题:第一个是每一个采样量化值都是近似值,是否足够精确;第二个是采样的频率是否足够稠密?

我们先来看一下第一个问题。这个例子是采用11个档次去量化的,所以恢复出来的信号与原信号会有较大的误差,如果采用256个档次或者更多档次,那么采样量化值就非常接近真实值了,恢复出来的数据也就能更接近真实值。采用的档次越多,每个采样量化值需要的二进制位数就越多(比如256档就需要8位二进制数),最终编码成的二进制数据量也就越大,精度越高,数据量也就越大。

再来看一下第二个问题。根据奈奎斯特采样定理,只要采样频率大于信号带宽的2倍,信号的信息就可以完整的保留下来。简单的说,采样的频率比信号变化的频率还大,凡是信号变化的地方都采样到了,当然也就没有丢失信息了。比如人的声音频率范围是0~3400Hz,所以采样率使用8000Hz,也就是1秒钟采样8000次,就能完整记录声音信息。音乐就要用更高的采样率,比如22500Hz或者44100Hz,这是因为乐器发出的声音频率范围更大。

使用这种方法编码出来的声音数据是原始数据(PCM数据),数据量很大,一般要采用声音的压缩算法进行压缩,比如MP3、WMA等,经过压缩后数据量能缩小为原来的1/10,但人耳一般察觉不到声音质量的损失。

其它类型的物理量都可以通过传感器转化成一维电信号,一维电信号都可以采用前面所述的方法进行编码转换成二进制数据。

2.5图像和视频的编码

如果把一幅图像进行网格化处理(如图2-4所示),每一个网格就可以算作一个像素,如果划分成1024x768个网格,那么大约有70万像素。


图2-4 图像由像素组成图

根据三基色原理,任何一种颜色都可以使用红、绿、蓝三种颜色调配出来。每一个像素必然是一种颜色,而每一种颜色都可以用三基色调配出来,所以每一个像素都可以转化成红、绿、蓝三个分量,红、绿、蓝都可以用0~255共256个档次进行划分,所以每一个像素都可以转化成3个0~255之间的数字。图像由若干像素组成,每个像素能转化成数字,自然整个图像也就转化成了一组数字,这些数字在计算机中也都以二进制的方式存在。通过图像传感器(CCD或CMOS)加上模数转化器(A/D)可以实现图像的数字化,数码相机中标称的几百万像素就是指的图像传感器的网格密度,网格密度越大图像的细节保留得就越好,当然数据量也就越大,所以大家看到得像素越高,照片文件就越大。

如果一秒钟播放25张以上的图像,那么人的眼睛看起来就是流畅的视频,所以视频可以看成一组图像,图像能用数字表示,视频当然也能用数字表示了。

数字化后的图像是原始图像,数据量也很大,可以采用JPEG等图像压缩标准进行压缩,视频可以采用MPEG-2、MPEG-4、H.264等标准进行压缩,图像能压缩为原来的几十分之一,视频能压缩为原来的几百分之一。能实现压缩的原因是:图片中某一部分相邻的像素可能近似甚至一样,视频中相邻的帧可能有一样的背景,只是一部分像素在运动,所以可以去除空间和时间上冗余,实现大幅压缩。

2.6指令的编码

计算机的指令数量都是有限的,当然一条指令可以选用一个二进制编码来表示,比如8051单片机的空指令“NOP”编码为“00000000”,再比如累加器A清零指令“CLR A”编码为“11100100”。如果指令都用二进制表示了,那么计算机只需要能存储二进制数据,就能存储计算机指令了,也就是程序可以实现存储。计算机从程序存储器中取出指令,通过指令控制其它功能单元工作,就实现了程序控制下的自动运行。

至此,大家可以看到,自然界的万事万物最终都可以化作一组数字,而计算机正是存储、处理、传输和展示数字的工具,计算机在某种意义上是不是正好体现了古希腊哲学家毕达哥拉斯的“万物皆数”的哲学思想呢?

2.7二进制的数量单位

一个二进制位(1或0)信息量为1 bit(缩写为b),8个bit为1 byte(缩写为B),主要单位换算如下:

l  1B = 8 bit;

l  1KB=1024B;

l  1MB=1024KB;

l  1GB=1024MB;

l  1TB=1024GB;

l  1PB=1024TB。

一个ASCII字符占用8位,也就是1个字节;一个汉字占用2个字节。一部《红楼梦》约70万字,信息量140万字节,所以大约需要1.4MB的存储空间存放。

一个大学的图书馆藏书约100万册,假设一本书50万字,那么100万册共需要约1TB的存储空间,也就是一块普通硬盘就可以存下,数字的神奇可见一斑。

假设网络带宽是2M,那么下载一部600MB的电影需要多少时间呢?

读者要知道,带宽2M指的是一秒钟传输2M二进制位,所需时间计算如下:


2.8进制之间的转换

计算机只能存储和传输二进制,但我们习惯使用的是十进制,有时候还使用十六进制,那么这些进制之间是怎样转化的呢?

(1)二进制转化成十进制

首先,我们看一下十进制的表示:


类似地,二进制也能这样转化:


可以看到二进制转十进制就是位值与权值之积的总和。

(2)十进制转化成二进制

要把25.125转化成二进制,应该怎样计算呢?

先把25转换成二进制,转换流程如图2-5所示。


图2-5 十进制整数转化成二进制的方法

转换方法:每次都除以2,计算出余数,最后把余数自下向上写成一个二进制数。所以:


再把0.125转换成二进制,流程如图2-6所示。


图2-6 十进制小数转化成二进制的方法

转换方法:小数部分不断乘以2,计算出整数部分,最后自上向下写成一个二进制数。所以:

,即:


(3)十六进制转换成十进制

十六进制就是满16进1,用0~9、A、B、C、D、E、F代表一位数,转成十进制的方法与二进制转十进制类似。


(4)二进制转化成十六进制

二进制转换成十六进制可以每4位二进制转换成1位十六进制,转换表如表2-4所示。

表2-4 16个数的进制对应表

十进制

0

1

2

3

4

5

6

7

十六进制

0

1

2

3

4

5

6

7

二进制

0000

0001

0010

0011

0100

0101

0110

0111

十进制

8

9

10

11

12

13

14

15

十六进制

8

9

A

B

C

D

E

F

二进制

1000

1001

1010

1011

1100

1101

1110

1111

例如:

十六进制转换成二进制反过来就可以了,一般十六进制可以用“0xFD”或者“FDH”来表示。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值