1.4.2 不同数制之间的相互转换
1.二进制数、八进制数、十六进制数转换成十进制数
转换的方法就是按照位权展开表达式,例如:
①(111.101)2=1×22+1×21+1×20+1×2-1+0×2-2+1×2-3=4+2+1+0.5+0+0.125=(7.625)10
②(774)8=7×82+7×81+4×80=(508)10
③(AF2.8C)16=A×162+F×161+2×160+8×16-1+C×16-2=10×162+15×161×2×160+8×16-1+12×16-2=2560+240+2+0.5+0.046875=(2802.546875)10
2.十进制数转换成二进制数
将十进制数转换成等值的二进制数,需要对整数和小数部分分别进行转换。整数部分转换法是连续除2,直到商数为零,然后逆向取各个余数得到一串数位即为转换结果,例如:
11÷2=5----------余数 1
5÷2=2------------余数 1
2÷2=1------------余数 0
1÷2=0------------余数 1
逆向取余数(后得的余数为结果的高位)得:(11)10=(1011)2
小数部分转换法是连续乘2,直到小数部分为零或已得到足够多个整数位,正向取积的整数(后得的整数位为结果的低位)位组成一串数位即为转换结果,例如:
0.7×2=1.4------------整数部分为 1
0.4×2=0.8------------整数部分为 0
0.8×2=1.6------------整数部分为 1
0.6×2=1.2------------整数部分为 1
0.2×2=0.4------------整数部分为 0(进入循环过程)
若要求4位小数,则算到第5位,以便四舍五入。结果得:(0.7)10=(0.1011)2
可见有限位的十进制小数所对应的二进制小数可能是无限位的循环或不循环小数,这就必然导致转换误差。仅将上述转换方法简单证明如下。
若有一个十进制整数A,必然对应有一个n位的二进制整数B,将B展开表示就得下式:
当式子两端同除以2,则两端的结果和余数都应当相等,分析式子右端,除了最末项外各项都含有因子2,所以其余数就是b0。同时b1项的因子2没有了。当再次除以2,b1就是余数。依此类推,就逐次得到了b2、b3、b4、…,直到式子左端的商为0。
小数部分转换方法的证明同样是利用转换结果的展开表达式,写出下式:
显然当式子两端乘以2,其右端的整数位就等于左端的b-1。当式子两端再次乘以2,其右端的整数位就等于左端的b-2。依此类推,直到右端的小数部分为0,或得到了满足要求的二进制小数位数。
最后将小数部分和整数部分的转换结果合并,并用小数点隔开就得到最终转换结果。
3.十进制数转换为八进制数和十六进制数
对整数部分“连除基数取余”,对小数部分“连乘基数取整”的转换方法可以推广到十进制数到任意进制数的转换,这时的基数要用十进制数表示。例如,用“除8逆向取余”和“乘8正向取整”的方法可以实现由十进制向八进制的转换;用“除16逆向取余”和“乘16正向取整”可实现由十进制向十六进制的转换。将269转换为八进制和十六进制数的计算如下:
4.八进制数和十六进制数与二进制数之间的转换
由于3位二进制数所能表示的也是8个状态,因此一位八进制数与3位二进制数之间就有着一一对应的关系,转换就十分简单。即将八进制数转换成二进制数时,只需要将每一位八进制数码用3位二进制数码代替即可,例如:
(367.12)8=(011110111.001010)2
为了便于阅读,这里在数字之间特意添加了空格。若要将二进制数转换成八进制数,只需从小数点开始,分别向左和向右每3位分成一组,用一位八进制数码代替即可,例如:
(10100101.00111101)2=(10100101.001111010)2=(245.172)8
这里要注意的是:小数部分最后一组如果不够3位,应在尾部用零补足3位再进行转换。
与八进制数类似,一位十六进制数与4位二进制数之间也有着一一对应的关系。将十六进制数转换成二进制数时,只需将每一位十六进制数码用4位二进制数码代替即可,例如:
(CF.5)16=(11001111.0101)2
将二进制数转换成十六进制数时,只需从小数点开始,分别向左和向右每4位一组用一位十六进制数码代替即可。小数部分的最后一组不足4位时要在尾部用0补足4位,例如:
(10110111.10011)2=(10110111.10011000)2=(B7.98)16