2010春季函授第一讲(进制转换)
- 格式:doc
- 大小:938.00 KB
- 文档页数:17
进制转换课件进制转换课件在计算机科学和信息技术领域,进制转换是一个基础而重要的概念。
它涉及将数字从一种进制表示转换为另一种进制表示的过程。
进制转换不仅在计算机编程中广泛应用,而且在日常生活中也有一定的实际应用。
本文将探讨进制转换的原理、方法和应用。
一、进制的概念进制是一种表示数字的方法,它定义了一组数字和符号的规则。
常见的进制有十进制、二进制、八进制和十六进制。
十进制是我们日常生活中最常用的进制,它使用0-9这10个数字来表示。
而二进制则只使用0和1这两个数字来表示,是计算机中最基础的进制。
八进制使用0-7这8个数字,十六进制使用0-9和A-F这16个数字来表示。
二、进制转换的原理进制转换的原理基于权重的概念。
在十进制中,每个数字的权重是10的幂次方,从右到左依次递增。
例如,数字123的权重分别是1、10和100。
而在二进制中,每个数字的权重是2的幂次方,从右到左依次递增。
例如,数字101的权重分别是1、0和4。
通过理解这种权重的概念,我们可以更好地进行进制转换。
三、十进制转换为其他进制将十进制转换为其他进制的方法是不断地进行除法和取余运算。
以将十进制数123转换为二进制为例,我们先将123除以2,得到商61和余数1。
然后将61再次除以2,得到商30和余数1。
重复这个过程,直到商为0为止。
最后,将得到的余数按照从下到上的顺序排列,就得到了二进制数1111011。
同样的方法可以用于将十进制转换为八进制或十六进制。
四、其他进制转换为十进制将其他进制转换为十进制的方法是将每个数字乘以对应的权重,然后将它们相加。
以将二进制数101转换为十进制为例,我们将1乘以2的0次方,再将0乘以2的1次方,最后将1乘以2的2次方。
然后将它们相加,得到十进制数5。
同样的方法可以用于将八进制或十六进制转换为十进制。
五、进制转换的应用进制转换在计算机编程中有广泛的应用。
在计算机内部,所有的数据都是以二进制的形式存储和处理的。
江苏省信息学奥赛(JSOI)网络函授B层次教学进制转换及应用一、十进制数人们通常使用的是十进制数。
十进制数的特点是有十个不同的数字:0,1,2,3,4,5,6,7,8,9,并且是“逢十进一”。
在十进制中,各位数字所表示的值不仅与该数字有关,而且与它所在的位置有关。
例如在数33中,十位上的3表示3个10,各位上的3表示3个1。
每个数位被赋于一定的位值,称为权。
十进制中,个、十、百、千……各位的权,依次为1,10,100,1000,…。
每个数位的数字所表示的值是这个数字与它相应权的乘积。
对于任意一个十进制数,都可以表示成按权展开的多项式。
例如:1804=1×103+8×102+0×101+4×10048.25=4×101+8×100+2×10-1+5×10-2一般地,对于一个十进制数a n a n-1…a1a0a-1…a-m(这里不考虑其正负),它可表示为:a n a n-1…a1a0a-1…a-m=a n10n+a n-110n-1+…+a1101+a0100+a-110-1+…+a-m10-m其中,a i是0—9十个数字中的任意一个,m,n为正整数。
这里的10被称为基数,它是相邻数位的权之比。
各数位的权是基数10的整数次幂。
有时,在一个数的下方注上基数10,来更明确地指出它是一个十进制数。
例如:(13)10,(8.2)10等。
二、二进制数在计算机中采用的是二进制。
二进制只需要两个不同的数字:0和1,并且是“逢二进一”。
它的基数是2,各数位的权也是基数的整数次幂。
对于二进制数,其整数部分各数位的权,从最低位开始依次是1,2,4,8,…;其小数部分各数位的权,从最高低位开始依次是0.5,0.25,0.125,…。
与十进制相仿,一个二进制数也可以表示成按权展开的多项式。
例如:(101)2=1×22+0×21+1×20(10.11)2=1×21+0×20+1×2-1+1×2-2这里要注意,不要把二进制(101)2读作“一百零一”,而应该读成“一零一”。
计算机的一个重要理论基础就是二进制思想。
任何信息最终都是以二进制数的形式存储在计算机中的。
计算机采用二进制,而不采用十进制,是因为二进制具有以下一些主要特点:(1)二进制数只含有两个数字0和1,因此可用大量存在的具有两个不同的稳定物理状态的元件来表示。
例如,可用指示灯的不亮和亮,继电器的断开和接通,晶体管的截止和导通,磁性元件的反向和正向剩磁,脉冲电位的低和高等等,来分别表示二进制数字0和1。
计算机中采用具有两个稳定状态的元件来表示,实现起来要容易得多。
同时,由于表示二进制数的元件的状态数少,因而数据传送不易出错,工作稳定可靠。
(2)二进制数的运算规则简单,使得计算机中的运算部件结构相应变得比较简单。
二进制数的加法和乘法的运算规则,都比十进制数简单得多。
它的加法工资额和乘法规则只有四条:0+0=0 0+1=1 1+0=1 1+1=10×0=0 0×1=0 1×0=0 1×1=1实际上,二进制数的乘法可通过简单的移位和相加来实现。
由于二进制数的运算规则简单,它的算术运算都可通过移位、相加这种简单的操作来实现。
这就使计算机的运算部件的结构简单,运行可靠。
(3)二进制数的两个数字0和1与逻辑代数的逻辑变量取值一样,从而可采用二进制数进行逻辑运算。
这样就可以应用逻辑代数作为工具来分析和设计计算机中的逻辑电路,使得逻辑代数成为计算机设计的数学基础。
三、不同进制数之间转换的基本算法是:在计算机中除了用到二进制以外,有时还用到十进制、八进制和十六进制。
所以,在实际应用中,经常需要将一个十进制数转换成二进制、八进制或十六进制的数,有时又需逆向转换,将二进制、八进制或十六进制的数转换成十进制数,有时还需要在二进制、八进制和十六进制数之间进行相互转换(2,8,10,16等一般称为“基”)。
不同进制数之间转换的基本算法是:(1)十进制整数转换成n进制数的方法:将十进制整数不断除以n取余,最后反序输出即可。
(2) n进制数(整数、实数都可以)转换成十进制数方法:按“权n”展开,即表示成若干项形如a i*n i的累加和即可。
(3)二进制、八进制、十六进制之间的转换方法:利用3位二进制表示1位八进制数,4位二进制数表示1位十六进制数的基本思想,3位一段(或4位一段)分别转换即可。
注:一般2≤n≤16,十进制以上、十六进制以下的数制除了0~9十个字符外,还用到A、B、C、D、E、F几个字符,分别表示10~15。
对于十进制,我们称它的基数为10,而二进制的基数就是2,十六进制的基数就是16。
对于十进制数1234.56,我们可以表示成1*103+2*102+3*101+4*100+5*10-1+6*10-2,我们把10i称之为十进制各个位的“权”。
对于二进制数11001.01001,我们也可以类似地表示成1*24+1*23+1*20+1*2-2+1*2-5,即二进制各个位的权为2i。
这一方法(按权展开)同样可以用在任意n进制中。
四、不同进制数之间的相互转换1、十进制正整数转换成任意n进制数[方法介绍]就是模拟小学学过的除法运算,比如要把十进制整数39转换成二进制数,则转换方法如下左图,即不断除以2,直到商为0,再倒序输出即可,结果一般表示为(39)10 =(100111)2 。
而要把十进制整数245转换成八进制数,方法一样,只要不断地除以8即可,如下右图所示,结果可以表示为:(245)10 = (365)8。
一定要注意的是“倒序输出”。
图1 十进制整数转换成n进制方法示意图[算法描述]设十进制数为Y,要转换成n进制,用数组a存放最后的转换结果,i为数组下标,则算法描述如下:i:=0;重复做:i:=i+1;a[i]:=Ymod nY:= Ydiv n直到Y=0为止。
依次输出最高位a[i]到最低位a[1]。
[参考程序] 将十进制整数Y转换成任意n进制数(设n<10)。
Program ex1(input,output);var a: array [1..100] of integer;n,y,i,j:longint;beginwrite('input number y: ');readln(y);write('input number n: ');readln(n);write('(',y,')10=','(');i:=0;repeati:=i+1;a[i]:=y mod n;y:=y div n;until y=0;for j:=i downto 1 do write (a[j]);writeln(')',n);readlnend.[程序样例]输入:2458输出:(245)10=(365)8[思考练习]如果n超过了10,比如要转换成十六进制数,可以用字符A、B、C、D、E、F分别表示数10~15,转换方法一样,只要在输出时把余数转换为字符(A~ F)即可。
这个程序请大家完成。
2、任意n进制数(整数、实数)转换成十进制数[方法介绍]我们知道一个十进制数1234.56,按权展开可以表示成1*103+2*102+3*101+4*100+5*10-1+6*10-2,同样,对于任意n进制数X,按权展开的方法是:(1101.01)2 = 1*23+1*22+0*21+1*20+0*2-1 +1*2-2= 8+4+0+1+0+0.25 = 13.25 (165)8 = 1*82 + 6*81 + 5*80 = 64+48+5 = 117这儿计算出来的13.25和117就是(1101.01)2和(165)8所对应的十进制数。
[参考程序] 将任意n进制整数X转换成十进制数(设n<10)。
Program ex2(input,output);const m=100;var str:string;n,i,weight,total:longint;a:array[1..m] of integer;beginwrite('input number n: ');readln(n);write('input number x: ');readln(str);write('(',str,')',n , '=(');for i:= 1 to Length(str) doa[i]:= ord (str[i])-ord ('0'); {取出数中的每一位}weight:=1;total:=a[Length(str)];for i:=Length(str)-1 downto 1 dobeginif a[i] > n then {判断输入的数是否合法}beginwriteln('input error! ');exit;end;weight:=weight*n; {累乘计算出每一位的权}total:=total+a[i]*weight; {按权展开每一位,累加求和} end;writeln(total,’)10’);readlnend.[程序样例]输入:2100110输出:(100110)2=(38)10[思考练习]如果n超过了十进制,则程序怎么修改呢?这个方法也适用于把任意n进制小数转换成十进制小数,方法基本一样。
因此,我们对一个n进制的实数,就可以把整数和小数部分截取出来后,分别进行转换,最后再加起来输出即可。
请大家完成。
3、将十进制小数转换为其它进制的小数[方法介绍]将十进制小数转换为其它进制的数,其基本算法是:将小数乘以待转换的进制数,正向取整。
例如把(0.325)10转换成二进制小数的过程如下图2所示:图2 十进制小数转换成其它进制小数方法示意图所以,运算结果是:(0.325)10≈(0. 0101)2大家发现,这种转换有时是一个近似值。
思考:为什么?[参考程序]程序请大家完成。
对于一个十进制的实数,我们就可以把整数和小数分解出来,分别转换成其它进制的整数和小数,最后再加起来输出结果。
4、二进制和十六进制之间的转换如要把二进制数(1111011001.01111)2转换成十六进制数,则我们以小数点为准,向前4位一段转换整数部分,不足则高位补0;再向后4位一段转换小数部分,不足则低位补0。
如下图,最后相加输出即可得到答案:(3D9.78)16。
图3 二进制数转换成十六进制数的方法示意图反之也一样,如要把十六进制数(A1F5.2)16二进制数,则结果为(1010 0001 1111 0101.0010)2。