在数字电路和计算机中,只有0和1两种符号表示信息,参与运算的数也是由0和1构成的。人们把0和1这两种符号称为二进制数。但是人们计数时习惯使用十进制数,所以在计算机操作时,一般都要把输入的十进制数转换为二进制数后再让计算机处理,计算结果再转换为人们熟悉的十进制数,所以要求读者熟悉各种数制以及不同数制之间的转换方法。
本章主要内容
& 学习不同进位制之间的转换方法
& 详细介绍各种编码规则
数制也称进位计数制,是按照进位的方法对数量进行计数的一种统计规律。在日常生活中,常常用到的是十进制数,也就是逢十进一的进位计数制。在数字系统中,常常用到的数制是二进制﹑八进制和十六进制。在学习数制之前,先来了解两个基本概念:基数和位权。
(1)基数。
基数是指一种数制中所用到的数码个数。一般说基数为R的数制就称为R进制,逢R进一,它包括0﹑1、…﹑R-1等数码。
(2)位权。
在一个进位计数制表示的数中,处在不同数位上的数码代表着不同的数值,某一个数位上的数值是由这一位上的数字乘以这个数位的位权值得到的。不同的数位上有不同的位权值。例如,十进制的百位的位权值是100,千位的位权值是1000,百分位的位权值是0.01。位权值简称为位权。
下面讲一下数的表示。任何一个数都可以将其数值按位权展开。下面用十进制数987.65来举例。
(987.65)10 =9×102+8×101+7×100+6×10-1+5×10-2
将这种表示方法推广,一个R进制的数N,设其有n位整数,m位小数且各位数字为K-m…、K0﹑K1、…、Kn-1,位权为R-m﹑…R0﹑R1﹑…、Rn-1。则:
(N)R=Kn-1Rn-1+…+K0R0+K-1R-1+…+K-mR-m (1.1)
基数为2的数制为二进制,因此,在二进制中,进位规律是逢二进一,表示数值的数字只有0和1。任何一个二进制数N可以表示为:
(N)2=Kn-12n-1+…+K020+K-12-1+…+K-m2-m
其中,Ki为0或1,2为位权。
在数字系统中之所以经常采用二进制,是因为它的运算很简单。下面给出它的运算规律。
0+0=0 1+1=1 0+1=1+0=1
0×0=0 1×1=1 0×1=1×0=0
可见,二进制的运算规律非常简单,而且因为它每位只有0和1两种表示,所以在数字系统中实现起来很方便。人们经常用0来表示低电位或晶体管的截止,用1来表示高电位或晶体管的导通等。
基数为8的数制为八进制,因此,在八进制中,进位规律是逢八进一,表示数值的数字有8个,即0~7。任意一个八进制数N可以表示为:
(N)8=Kn-18n-1+…+K080+K-18-1+…+K-m8-m
其中,Ki为0~7中的一个数,8为位权。
基数为16的数制为十六进制,因此,在十六进制中,进位规律是逢十六进一。十六进制表示数值的数字比较特殊,共有16个,包括0~9十个数字和A﹑B﹑C﹑D﹑E﹑F(分别表示10~15)6个符号。任意一个十六进制数N可以表示为:
(N)16=Kn-116n-1+…+K0160+K-116-1+…+K-m16-m
其中,Ki为0~9以及A﹑B﹑C﹑D﹑E﹑F中的一个数,16为位权。
在实际的数字系统中,普遍采用二进制,但是二进制写起来冗长,不方便记忆,而且人们通常习惯十进制计数,所以在实际操作中,往往需要先将十进制或其他进制的数值转换为二进制的数值后,进入数字系统处理,最后再将处理后的二进制数值转换为人们熟悉的十进制或其他进制的数值。这就是下面要讲到的不同数制之间的转换问题。
将一个任意进制的数转换为十进制数方法很简单,就是利用式(1.1)将任意进制数展开,得到的就是十进制数。下面用几个例题来说明。
【例1-1】将二进制数(101011.01)2转换为十进制数。
解:根据式(1.1),在这里n=6,m=2,R=2,有
(101011.01)2=1×25+1×23+1×21+1×20+1×2-2
=32+8+2+1+0.25
=(43.25)10
【例1-2】将八进制数(57)8转换为十进制数。
解:根据式(1.1),在这里n=2,m=0,R=8,有
(57)8=5×81+7×80
=40+7
=(47)10
【例1-3】将十六进制数(7E.A)16转换为十进制数。
解:根据式(1.1),在这里n=2,m=1,R=16,要注意在转换时,A~F要对应写成10~15。
(7E.A)16 =7×161+14×160+10×16-1
=112+14+0.625
=(126.625)10
【例1-4】将五进制数(236.43)5转换为十进制数。
解:根据式(1.1),在这里n=3,m=2,R=5,有
(236.43)5=2×52+3×51+6×50+4×5-1+3×5-2
=50+15+6+0.8+0.12
=(71.92)10
十进制数转换为其他任意进制数,因为整数部分和小数部分的转换方法不一样,所以要分别转换后再将其加到一起,下面分别讨论整数部分和小数部分的转换方法。
(1)十进制整数部分转换。
十进制整数转换为R进制数的方法是:将该十进制整数除R取余,然后逆序排列。具体就是用十进制整数除以R,得到一个商和余数,然后用商再除以R,得到一个新商和一个新的余数,再将新商除以R,以此类推,这样不断进行下去,直到所得的商为0为止。下面举几个例子来说明。
【例1-5】将十进制数(97)10转换为二进制数。
解:R=2,采取除2取余的方法。运算过程为:
然后将余数逆序排列,所谓逆序排列就是最先得到的余数是二进制数的最低位,最后得到的是二进制数的最高位,得1100001,即为所求。所以转换结果为:
(97)10 =(1100001)2
【例1-6】将十进制数(65)10转换为八进制数。
解:因为R=8,所以采用除8取余、逆序排列的方法。
然后将余数逆序排列,得101。所以转换结果为:
(65)10 =(101)8
【例1-7】将十进制数(275)10转换为十六进制数。
解:因为R=16,所以采用除16取余、逆序排列的方法。
然后将余数逆序排列,得113。所以转换结果是:
(275)10 =(113)16
由上面的例题可见,采用除R取余、逆序排列的方法可以将十进制数转换为R进制数。
(2)十进制小数部分转换。
将十进制小数转换为R进制数的方法是:将十进制小数乘R取整,然后顺序排列。具体就是将十进制的小数乘以R,将其乘积的整数部分取出,剩下的小数部分继续乘以R,得到一个新的乘积,再取出整数部分,将剩下的小数部分乘以R,如此下去直到乘积的小数部分为0,或者达到了要求的精确位数为止。下面举例说明。
【例1-8】将十进制数(0.375)10转换为二进制数。
解:R=2,所以乘2取整,顺序排列。运算过程为:
将取到的整数顺序排列,得0.011。所以转换结果为:
(0.375)10 =(0.011)2
0.375 取整数
× 2
0.75 0
× 2
1.5 1
0.5
× 2
1 1
在本题中,由于最后的小数部分刚好为0,所以没有误差。
【例1-9】将十进制数(0.69)10转换为二进制数。
解: 0.69 取整数
× 2
1.38 1
0.38
× 2
0.76 0
× 2
1.52 1
0.52
× 2
1.04 1
将取到的整数顺序排列,得0.1011。所以转换结果为:
(0.69)10 =(0.1011)2
在本题中,由于结果取到小数点后第4位,所以误差e<2-4。
【例1-10】将十进制数(0.23)10转换为八进制数。
解: 0.23 取整数
× 8
1.84 1
0.84
× 8
6.72 6
0.72
× 8
5.76 5
将取到的整数顺序排列,得0.165。所以转换结果为:
(0.23)10=(0.165)8
在本题中由于结果取到小数点后第3位,所以误差e<8-3。
【例1-11】将十进制数(0.87)10转换为十六进制数。
解: 0.87 取整数
× 16
13.92 13
0.92
× 16
14.72 14
0.72
× 16
11.52 11
0.52
× 16
8.32 8
将取到的整数顺序排列,得0.DEB8。所以转换的结果为:
(0.87)10=(0.DEB8)16
在本题中,由于结果取到小数点后第4位,所以误差e<16-4。
(3)既有整数部分又有小数部分的十进制数转换。
对于一个既有整数部分又有小数部分的十进制数,要把它转换为其他进制数,只要按照上面的方法,将整数部分和小数部分分别转换成其他进制的数后,再加到一起就可以了。下面举例说明。
【例1-12】将十进制数(13.85)10转换为二进制数。
解:首先,进行整数部分的转换。
将余数逆序排列,得1101。所以整数部分的转换结果为:
(13)10=(1101)2
然后进行小数部分的转换。
0.85 取整数
× 2
1.70 1
0.70
× 2
1.40 1
0.40
× 2
0.80 0
× 2
1.60 1
0.60
× 2
1.20 1
将取到的整数顺序排列,得0.11011,所以小数部分转换的结果是:
(0.85)10=(0.11011)2
最后将整数部分和小数部分相加,得
(13.85)10=(1101.11011)2
因为23=8,所以二进制与八进制间有着简单的转换方法,就是将3位二进制数看作1位八进制数。具体来说,若要把二进制数转换为八进制数,就以小数点为分界,整数部分从低位到高位分组,每3位代表1位八进制数,最高位不足3个则补0;小数部分从高位到低位分组,每3位代表1位八进制数,最低位不够3个则补0。最后对应得到八进制数。下面举例说明。
【例1-13】将二进制数(10101110.0100111)2转换为八进制数。
解:根据上述方法,
010 101 110 . 010 011 100
↓ ↓ ↓ ↓ ↓ ↓
2 5 6 . 2 3 4
所以,
(10101110.0100111)2 =(256.234)8
若将八进制数转换为二进制数,即为上述方法的逆过程,举例说明。
【例1-14】将八进制数(153.521)8转换为二进制数。
解:1 5 3 . 5 2 1
↓ ↓ ↓ ↓ ↓ ↓
001 101 011 . 101 010 001
所以,
(153.521)8=(1101011.101010001)2
因为24=16,所以二进制数与十六进制数间的转换方法和二进制数与八进制数之间的转换方法类似,就是将4位二进制数看作1位十六进制数。具体来说,若要把二进制数转换为十六进制数,就以小数点为分界,整数部分从低位到高位分组,每4位代表1位十六进制数,最高位不足4个则补0;小数部分从高位到低位分组,每4位代表1位十六进制数,最低位不够4个则补0。最后对应得到十六进制数。下面举例说明。
【例1-15】将二进制数(1110101100.010010111)2转换为十六进制数。
解:0011 1010 1100 . 0100 1011 1000
↓ ↓ ↓ ↓ ↓ ↓
3 10 12 . 4 11 8
所以,
(1110101100.010010111)2(3AC.4B8)16
【例1-16】将十六进制数(5F1.38B)16转换为二进制数。
解:5 15 1 . 3 8 11
↓ ↓ ↓ ↓ ↓ ↓
0101 1111 0001 . 0011 1000 1011
所以,
(5F1.38B)16 =(10111110001.001110001011)2