计算机中常用几种不同的进位数制,包括二(八、十六)进制和十进制。二进制数据更容易用逻辑线路处理,更接近计算机硬件能直接识别和处理的电子化信息的使用要求,而使用计算机的人更容易接受十进制的数据类型。二者之间的进制转换是经常遇到的问题,应熟练掌握。
(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 二、八、十六和十进制的对应关系
二进制数 | 八进制数 | 十六进制数 | 十进制数的值 |
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 | 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 | 0 1 2 3 4 5 6 7 8 9 A B C D E F | 0 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
八和十六进制之间的转换不怎么常用,经过二进制的中间结果进行转换是方便的。