进制转化.docx
《进制转化.docx》由会员分享,可在线阅读,更多相关《进制转化.docx(28页珍藏版)》请在冰豆网上搜索。
进制转化
计算机基础:
进制转换
课题引入
生活中其实很多地方的计数方法都多少有点不同进制的影子。
比如我们最常用的10进制,其实起源于人有10个指头。
如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用20进制。
至于二进制……没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则我们常说的是:
1双袜子。
生活中还有:
七进制,比如星期。
十六进制,比如小时或“一打”,六十进制,比如分钟或角度……
知识阅读:
《周易》、二进制和计算机
大家知道,在电子计算机中,信息、指令、状态都是用二进制数表示的,运算、处理也是用二进制数进行的。
随着计算机的普及,二进制愈来愈成为人们津津乐道的话题。
在数学史上,二进制数系是和德国伟大的数学家Leibniz(1646-1716)的名字联系在一起的。
现在流行着一种时髦的说法,说二进制来源于中国,因为《周易》中早已有了二进制。
还有人进一步发挥说,既然二进制来源于中国,那么,计算机的老祖宗也应该在中国。
某大报在头版头条论述所谓“留给二十一世纪的悬念”的文章中就说,Leibniz受《周易》启发,发明了二进制和计算机。
一、十进制数
十进制数是日常生活中使用最广的计数制。
组成十进制数的符号有0,1,2,3,4,5,6,7,8,9等共十个符号,我们称这些符号为数码。
在十进制中,每一位有0~9共十个数码,所以计数的基数为10。
超过9就必须用多位数来表示。
十进制数的运算遵循:
加法时:
“逢十进一”;减法时:
“借一当十”。
十进制数中,数码的位置不同,所表示的值就不相同。
式中,每个对应的数码有一个系数1000,100,10,1与之相对应,这个系数就叫做权或位权。
十进制数的位权一般表示为:
10n-1
式中,10为十进制的进位基数;10的i次为第i位的权;n表示相对于小数点的位置,取整数;当n位于小数点的左边时,依次取n=1、2、3……n。
位于小数点的右边时,依次取n=-1、-2、-3……因此,634.27可以写为:
634.27=6×102+3×101+4×100+2×10-1+7×10-2
在正常书写时,各数码的位权隐含在数位之中,即个位、十位、百位等。
二、二进制
计算机作为一种电子计算工具,是由大量的电子器件组成的,在这些电子器件中,电路的通和断、电位的高和低,用两个数字符号“1”和“0”分别表示容易实现。
同时二进制的运算法则也很简单,因此,在计算机内部通常用二进制代码来作为内部存储、传输和处理数据。
1、可行性:
若使用十进制数,则需要这样的电子器件,它必须有能表示0—9数码的10个物理状态,这在技术上是相当困难的(目前为止没有完全解决),而使用二进制数,只需0,1两个状态,技术上轻而易举,如开关的通与断,晶体管中导通与截止等,磁介质的带磁与不带磁。
2、可靠性:
二进制只有两种状态,数字传输处理不易出错。
3、简易性:
二进制运算法则比较简单,如:
求和法则(3个):
0+0=0,0+1=1+0=1,1+1=10
求积法则(3个):
0×0=0,0×1=1×0=0,1×1=1
这就使计算机运算器的结构大大简化,控制也简单,较容易实现
4、逻辑性:
可用进制的0,1直接代表逻辑代数中的“假”和“真”
因此,电子计算机处理的信息,都是仅用“0”与“1”两个简单数字表示的信息,或者是用这种数字进行了编码的信息。
这种数制叫做二进制。
要了解计算机,首先要了解计算机中数的表示方法。
为了区别不同数制表示的数,通常用右括另外下标数字或字母表示数制,十进制数用D表示,二进制用B表示,十六进制数用H表示,八进制用O表示。
二进制计算法的特点:
①二进制数只有“0”和“1”两个数码,基数是2,最大的数字是1;②采用逢二进一的原则。
二进制的位权一般表示为:
2n-1。
各位的权为以2为底的幂。
例如,(01101010)各位的权自至在依次为27、26、25、24、23、22、21、20。
二进制数的算术四则运算规则,除进、借位外与十进制数相同。
■二进制加法规则
0+0=01+0=1
0+1=11+1=10(粗体为进位位)
■二进制减法规则
0-0=00-1=1-借位
1-0=11-1=0
■二进制乘法规则
0×0=01×0=0
0×1=01×1=1
为了区别于十进制数,在书写时二进制数可以用两种方法表示:
例如:
(1011.01)2或1011.1B。
例如:
写出(1011.01)2的十进制数表达式。
(1011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2=(11.25)10
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:
01100100,转换为10进制为下面是竖式:
第0位0*20 =0
第1位0*21 =0
第2位1*22 =4
第3位0*23 =0
第4位0*24 =0
第5位1*25 =32
第6位1*26 =64
第7位0*27 =0
+
---------------------------
100
用横式计算为:
0*20+0*21+1*22+1*23+0*24+1*25+1*26+0*27=100
注意:
0乘以多少都是0,所以我们也可以直接跳过值为0的位:
1*22+1*23+1*25+1*26=100
从上面可以看出计数的习惯都是从0开始,所以,在你看明白上面那行内容后,让我们立刻改口换成下面的说法,以后我们只用这种说法:
二进制数:
第0位数表示几个1(20),第1位数表示几个2(21),第3位数表示几个4(22),第4位数表示向个8(23)……
按照这种说法,我们可以发现,从右向左数,第n位数的权值=2的n次方。
二进制各位权值的计算方法:
第n位权值=2n
下表详细地表示2进制数:
11111111是如何逐位计算,累加得到10进制的值:
第几位
7
6
5
4
3
2
1
0
合计
权值
27=128
26=64
25=32
24=16
23=8
22=4
21=2
20=1
2进制
1
1
1
1
1
1
1
1
10进制
128
64
32
16
8
4
2
1
255
上表表示了这么一个计算过程(*表示乘号):
1*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20=255
(顺便说一句,如果你忘了20等于多少有点迟疑,请复习一下初中的数学知识:
任何数的0次方都等于1)
结果是:
11111111(b)=255(d)
(为不了互相混淆,我们在书中常用(b/B)来表示前面的数是2进制的,而(d/D)则表示该数是10进制数。
同样地,另有8进制数用(o/O)表示,16进制用(h/H)表示。
不过记住了,这只是在书中使用,在程序中,另有一套表示方法。
)
以前我们知道1个字节有8位,现在通过计算,我们又得知:
1个字节可以表达的最大的数是255,也就是说表示0~255这256个数。
那么两个字节(双字节数)呢?
双字节共16位。
111111*********1,这个数并不大,但长得有点眼晕,从现在起,我们要学会这样来表达二制数:
1111111111111111,即每4位隔一空格。
双字节数最大值为:
1*215+1*214+1*213+1*212+1*211+1*210+……+1*22+1*21+1*20=65535
很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。
具体的计算方法方法是,如果它有n位,那么最大值就是:
n位二进制数的最大值:
1*2(n-1)+1*2(n-2)+...+1*20
任何一种基本数据类型,都有其范围。
比如字符类型,它的最大值是255,那么,当一个数在其类型的范围已经是最大值时,如果再往上加1,就会照成“溢出”。
其实,有限定的范围的数量,并不只在计算机中出现。
钟表就是一个例子。
10点再加1点是11点,再加1点是12点,可是再加1点,就又回到1点。
再如汽车的行程表,假设最多只能显示99999公里,当达到最高值后继续行驶,行程表就会显示为00000公里。
二进制的优点是:
■二进制只有“0”和“1”两数字,很容易表示。
电压的高和低、晶体管的截止与饱和、磁性材料的磁化方向等都可以表示为“0”和“1”两种状态。
■二进制数的每一位只有0和1两状态,只需要两种设备就能表示,所以二进制数节省设备。
由于状态简单,所以抗干扰力强,可靠性高。
二进制的主要缺点是数位太长,不便阅读和书写,人们也不习惯。
为此常用八进制和十六进制作为二进制的缩写方式。
为了适应人们的习惯,通常在计算机内都采用二进制数,输入和输出采用十进制数,由计算机自己完成二进制与十进制之间的相互转换。
三、十六进制数
二进制数在计算机系统中处理很方便,但当位数较多时,比较难记忆及书写,为了减小位数,通常将二进制数用十六进制表示。
2进制,用两个阿拉伯数字:
0、1;
8进制,用八个阿拉伯数字:
0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:
0到9;
16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?
16进制就是逢16进1,但我们只有0-9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。
字母不区分大小写。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……。
所以,在第N(N从0开始)位上,如果是是数X(X大于等于0,并且X小于等于15,即:
F)表示的大小为X*16的N次方。
假设有一个十六进数2AF5,那么如何换算成10进制呢?
用竖式计算:
第0位:
5*160=5
第1位:
F*161=240
第2位:
A*162=2560
第3位:
2*163=8192
+
-------------------------------------
10997
直接计算就是:
5*160+F*161+A*162+2*163=10997
(别忘了,在上面的计算中,A表示10,而F表示15)
现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。
假设有人问你,十进数1234为什么是一千二百三十四?
你尽可以给他这么一个算式:
1234=1*103+2*102+3*101+4*100
十六进制是计算机系统中除二进制数之外使用较多的进制,其计数法的特点为:
①有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F等共十六个数码,其分别对应于十进制数的0~15;
②十六进制数的加减法的进/借位规则为:
借一当十六,逢十六进一。
十六进制数的位权一般表示为:
16n-1。
其中16是十六进制的进位基数,n表示相对小数点的位置。
在书写时,用加注16或H的方式表示十六进制数,例如:
(8FA.5)16或8FA.5H。
例如:
写出(8FA.5)16的十进制数表达式。
(8FA.5)16=8×162+15×161+10×160+5×16-1=(2298.3125)10
四、八进制数
八进制计数法的特点是:
有八个不同的计算符号0、1、2、3、4、5、6、7,这八个符号称为数码。
采用逢八进一的原则。
对应于十进制数0、1、2、3、4、5、6、7、8,八进制数分别记作0、1、2、3、4、5、6、7、8、10。
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
所以,设有一个八进制数:
1507,转换为十进制为:
用竖式表示:
第0位7*80=7
第1位0*81=0
第2位5*82=320
第3位1*83=512
+
--------------------------
839
同样,我们也可以用横式直接计算:
7*80+0*81+5*82+1*83=839结果是,八进制数1507转换成十进制数为839
下表列出了十进制0~16对应的二进制数和十六进制数。
十进制数
二进制数
十六进制数
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
16
10000
10
五、十进制数转化为非十进制数
十进制转换数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最后将结果合并为目的数。
●整数部分的转换
整数部分的转换是采用除基取余法。
所谓除基取余法就是用欲转换的数据的基数去除十进制数的整数部分,第一次除取得的余数为目的数的最低位,把得到的商再除以该基数,所得余数为目的数的次低位,依此类推,继续上面的过程,直到商为0时,所得余数为目的数的最高位。
1、十进制转换成二进制
例1、:
将十进制的168转换为二进制(10101000)2
分析:
第一步,将168除以2,商84,余数为0
第二步,将商84除以2,商42余数为0
第三步,将商42除以2,商21余数为0
第四步,将商21除以2,商10余数为1
第五步,将商10除以2,商5余数为0
第六步,将商5除以2,商2余数为1
第七步,将商2除以2,商1余数为0
第八步,将商1除以2,商0余数为1
第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000。
例2、6转换成二进制,结果是110。
把上面的一段改成用表格来表示,则为:
被除数
计算过程
商
余数
6
6/2
3
0
3
3/2
1
1
1
1/2
0
1
(在计算机中,÷用/来表示)
如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:
(图:
1)
请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。
说了半天,我们的转换结果对吗?
二进制数110是6吗?
你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。
练习:
例 将十进制53D转换为二进制数110101B。
●小数部分的转换
小数部分的转换是采用乘基取整法。
所谓乘基取整法就是用该小数乘上目的数制的基数,第一次乘得结果的整数部分为目的数的小数部分的最高位,其小数部分再乘上基数,所得结果的整数部分为目的数的次高位,依此类推,继续上述的过程,直到小数部分为0或达到要求的精度为止。
方法:
乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分
为零为止。
如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。
换句话说就是0舍1入。
读数要从前面的整数读到后面的整数,下面举例:
例1:
将0.125换算为二进制(0.001)2
分析:
第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25;
第二步,将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5;
第三步,将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0;
第四步,读数,从第一位读起,读到最后一位,即为0.001。
例2,将0.45转换为二进制(保留到小数点第四位)
大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。
这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。
那么,我们可以得出结果将0.45转换为二进制约等于(0.0111)2
从上面可以看出该数在转换为二进制时,尽管已经过了解5次相乘,但其小数位还存在,由于题目要求保留小数后4位,故结果为:
0.736D≈0.1011B或0.736D≈0.1100B。
上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是:
1)十进制转换为二进制,需要分成整数和小数两个部分分别转换。
2)当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法。
3)注意他们的读数方向。
因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。
●二进制转换为十进制不分整数和小数部分:
方法:
按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。
例
将二进制数101.101转换为十进制数。
得出结果:
(101.101)2=(5.625)10
1*22+0*21+1*20+1*2-1+0*2-2+1*2-3=4+1+0.5+0.125=(5.625)10
大家在做二进制转换成十进制需要注意的是:
1)要知道二进制每位的权值。
2)要能求出每位的值。
2、十进制转换成八进制
10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:
除数由2变成8。
来看一个例子,如何将十进制数120转换成八进制数。
用表格表示:
被除数
计算过程
商
余数
120
120/8
15
0
15
15/8
1
7
1
1/8
0
1
120转换为8进制,结果为:
170。
2、十进制转换成十六进制
10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:
除数由2变成16。
同样是120,转换成16进制则为:
被除数
计算过程
商
余数
120
120/16
7
8
7
7/16
0
7
120转换为16进制,结果为:
78。
作业:
请拿笔纸,采用(图:
1)的形式,演算上面两个表的过程。
六、非十制数转换成十进制数
由于任一数都可以按权展开,于是很容易将一个非十进制数转换为相应的十进制数。
具体的步骤是:
将一个非十进制按权展开成一个多项式,每项是该位的数码与相应的权之积,把多项式按十进制数的规则进行计算机求和,所得结果即是该数的十进制。
七、二进制与十六进制数、八进制数的相互转换
四位二进制数共有十六种组合,而十六种组合正好与十六进制的十六种组合一致,故每四位二进制数对应于一位十六进制数,因此二进制数与十六进制之间的转换非常简单。
三位二进制数共有八种组合,而八种组合正好与八进制的八种组合一致,故每三位二进制数对应于一位八进制数,因此二进制数与八进制之间的转换也非常简单。
下面通过四个例子来说其转换:
从上面例子可以总结出两种进制转换的方法:
★二进制转换为十六进制时:
只要将二进制数的整数部分自右向左每四位一组,最后不足四位的用零补足;小数部分则自左向右每四位一组,最后不足四位时在右边补零。
再把每四位二进制数对应的十六进制数写出来即可。
例1、:
将二进制11101001.1011转换为十六进制
得到结果:
将二进制11101001.1011转换为十六进制为E9.B
例2、:
将101011.101转换为十六进制
得到结果:
将二进制101011.101转换为十六进制为2B.A
★十六进制数转换为二进制数的正好与此相反,只要将每位的十六进制数对应的四位二进制写出来即行了。
例1、将十六进制6E.2转换为二进制数
得到结果:
将十六进制6E.2转换为二进制为01101110.0010即110110.001
★二进制转换为八进制时:
只要将二进制数的整数部分自右向左每三位一组,最后不足三位的用零补足;小数部分则自左向右每三位一组,最后不足三位时在右边补零。
再把每三位二进制数对应的八进制数写出来即可。
例1、将二进制数101110.101转换为八进制
得到结果:
将101110.101转换为八进制为56.5
例2、将二进制数1101.1转换为八进制
得到结果:
将1101.1转换为八进制为15.4
★八进制数转换为二进制数的也正好与此相反,只要将每位的八进制数对应的三位二进制写出来即行了。
例1、将八进制数67.54转换为二进制
得到结果:
将八进制数67.54转换为二进制110111.101100,即110111.1011
注意:
一般情况先将十进制转化为二进制,有二进制转化为其他进制,如十六进制和八进制。
八、常用编码
BCD编码
在数字系统中,各种数据要转换为二进制代码才能进行处理,而人们习惯于使用十进制数,所以在数字系统的输入输出中仍采用十进制数,这样就产生了用四位二进制数表示一位十进制数的方法,这种用于表示十进制数的二进制代码称为二-十进制代码(BinaryCodedDecimal),简称为BCD码。
它具有二进制数的形式以满足数字系统的要求,又具有十进制的特点(只有十种有效状态)。
在某些情况下,计算机也可以对这种形式的数直接进行运算。
常见的BCD码表示有以下几种。
8421BCD编码
这是一种使用最广的BCD码,是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1。
例 写出十进数563.97D对应的8421BCD码。
563.97D=010101100011.100101118421BCD
例 写出8421BCD码1101001.010118421BCD对应的十进制数。
1101001.010118421BCD=01101001.010110008421BCD=69.58D
在使用8421BCD码时一定要注意其有效的编码仅十个,即:
0000~1001。
四位二进制数的其余六个编码1010,1011,1100,1101,1110,1111不是有效编码。
2421BCD编码
2421BCD码也是一种有权码,其从高位到低位的权分别为2,4,2,1,其也可以用四位二进制数来表示一位十进制数。
其编码规则如下表。
余3码
余3码也是一种BCD码,但它是无权码,但由于每一个码对应的8421BCD码之间相差3,故称为余3码,其一般使用较少,故正须作一般性了解,具体的编码如下表。
常见BCD编码表
十进制数
8421BCD码
2421BCD码
余3码
0
0000
0