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