计算机中常用几种不同的进位数制,包括二(八、十六)进制和十进制。二进制数据更容易用逻辑线路处理,更接近计算机硬件能直接识别和处理的电子化信息的使用要求,而使用计算机的人更容易接受十进制的数据类型。二者之间的进制转换是经常遇到的问题,应熟练掌握。
(1)二 (八、十六) 进制 十进制数据转换
公式 (2.3) 确定的运算规则,是不同进位计数制数据之间完成进位制转换的依据。
十进制到二进制的转换,通常要区分数的整数部分和小数部分,并分别按除2取余数部分和乘2取整数部分两种不同的方法来完成。
对整数部分,要用除2取余数办法完成十→二的进制转换,其规则是:
用2除十进制数的整数部分,取其余数为转换后的二进制数整数部分的低位数字;
再用2去除所得的商,取其余数为转换后的二进制数高一位的数字;
重复执行第二步的操作,直到商为0,结束转换过程。
例如, 将10进制的37转换成二进制整数的过程如下:
余数部分,即转换后的结果,为(100101) 2。
对小数部分,要用乘2取整数办法完成十→二的进制转换,其规则是:
用2乘十进制数的小数部分,取乘积的整数为转换后的二进制数的最高位数字;
再用2乘上一步乘积的小数部分,取新乘积的整数为转换后二进制小数低一位数字;
重复第二步操作,直至乘积部分为0,或已得到的小数位数满足要求,结束转换过程。
例如,将十进制的0.43,转换成二进制小数的过程如下(假设要求小数点后取5位):
整数部分,即转换后的二进制小数为(0.01101)2。
对小数进行转换的过程中,转换后的二进制已达到要求位数,而最后一次的乘积的小数部分不为0,会使转换结果存在误差,其误差值小于求得的最低一位的位权。
对既有整数部分又有小数部分的十进制数, 可以先转换其整数部分为二进制数的整数部分,再转换其小数部分为二进制的小数部分,通过把得到的两部分结果合并起来得到转换后的最终结果。例如,(37.43)10 = (100101.01101)2 。
在实现手工转换时,如果对二进制数已经比较熟悉,基本上记住了以2为底的指数值,即二进制数每一位上的权,对十进制数进行转换时,也可以不采用上述规则,基本上可以直接写出来。例如,
(45.625)10=32+8+4+1+0.5+0.125=(10 1 1 01. 10 1) 2,即(101101.101)2。
(1105)10 = 1024+81 = 1024+ 64+16 + 1= (1000 10 10001) 2,即(10001010001)2。
参照上述方法,也可以实现十→八进制, 十→十六进制的转换过程。例如,
结果:(1109)10 =(2125)8
结果:(0.385)10 =(0.305)8
完成 十→十六 进制数的转换方法与前述方法类似,只是乘除16时,手工运算不大方便。
(2) 二 八 及 二 十六的进制转换
用二进制表示一个数值N,所用的位数K为log2N,如表示4096, K为13,写起来位串较长。为此,计算机中也常常采用八进制和十六进制来表示数值数据,为表示数值N,分别有如下对应关系:
m-1
N = ∑ Di * 8i (2.5) Di 的取值为0到7
i = -k
例如 (7.44)8 = 7*80 + 4*8-1 + 4*8-2 = (7.5625)10 。
m-1
N = ∑ Di * 16i (2.6) Di 的取值为0到9和A到F
i = -k
例如 (1A.08) 16 = 1*161 + 10*160 + 8*16-2 = (26.03125)10 。
上述二式中所用符号的意义与公式(2.3)中所用符号的意义类同,但此处Di包含的基本符号分别限于0-7和0-9、A-F,各位的码权分别为8i和16i
把用二进制、八进制、十六进制表示的数转换成10进制数的值, 使人能更容易地衡量这个数值的大小。
二进制数与八进制、十六进制数的关系
由于log28=3, log216=4, 即一位8进制的数可以用3位二进制的数重编码来得到, 一位16进制的数可以用4位二进制的数重编码得到, 故人们通常认为, 在计算机这个领域内, 8进制和16进制数, 只是二进制数的一种特定的表示形式。表2.1给出少量二、八、十六和十进制数的对应关系:
表2.1 二、八、十六和十进制的对应关系
二进制数八进制数十六进制数十进制数的值00000001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
111100
01
02
03
04
05
06
07
10
11
12
13
14
15
16
170
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在把二进制数转换成八进制或十六进制表示时,应从小数点所在位置分别向左、向右对每三位或每四位二进制位进行分组,写出每一组所对应的一位八或十六进制数。若小数点左侧(即整数部分)的位数不是3或4的整数倍,可以按在数的最左侧补零的方法理解;对小数点右侧(即小数部分),应按在数的最右侧补零的方法处理,否则容易转换错。对不存在小数部分的二进制数(整数),应从最低位开始向左把每3位划分成一组,使其对应一个八进制位,或把每4位划分成一组,使其对应一个十六进制位,例如:
(10.101) 2 变成八进制时,应把它理解为(010.101)2,是(2.5)8 , 即八进制的2.5。当把它转换为十六进制时,应首先变为(0010.1010)2,是(2.A) 16,即十六进制的2.A,而不是(2.5)16。又如,
(1100111.10101101) 2 = (147.532) 8
(1100111.10101101) 2 = (67.AD)16
八和十六进制之间的转换不怎么常用,经过二进制的中间结果进行转换是方便的。