全部博文(921)
分类: BSD
2006-07-20 00:33:14
进制转换----吐血大作[原创]
我对进制的一点理解
-------献给计算机初学者
版权归夏雨天MASM所有,转载请保持完整,谢谢.
通常我们所说的数字,一般都是十进制,10分就1毛,10毛就1块......这些数字只是由十个数组成,那就是:0.1.2.3.4.5.6.7.8.9[我们一般称之为基数]
都是这些数,但它们处于不同位置所代表的重量就不一样了哦,如111,都是1但就是不一样,这就涉及到了位权的概念了,可用以下实例来说明。一个十进制数结4 5 5 3 .8 7可表示为:
4553.87=4×10(3)+5×10(2)+5×10(1)+3×10(0)+8×10(-1)×7×10(-2)
[声明:(N)表示的是N次方]
在这个数中,有些相同的数字由于处在不同的位置,它们代表的数值的大小也不同,各位数字所代表的数值的大小是由位权来决定的。位权是一个乘方值,乘方的底数为进位计数制的基数(本例中为1 0 ),而指数由各位数字在数中的位置来决定。以上的十进制数中,从左至右各位数字的位权分别为:10(3)、10(2).10(1)、10(0)、10(-1)、10(-2)。一般而言,在进位制中,把一个数中各位数字为1时代表的数值大小称为位权。如456它们的位权就是当各位为1时的数值大小,456中的4的位权就是10(2),5的位权就是10(1),6的位权就是10(0).
除了位权对于进制记数的另一个重要概念就是基数,基数很好理解,就是进位计数制中所使用的不同基本符号的个数称为该计数制的基数,比如十进制就是1.2.3.4.5.6.7.8.9.0这十个数,相对而言二进制就两个基数:0和1,八进制就是:0.1.2.3.4.5.6.7.8,十六进制就是:0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F
由上面两个概念可以得出以下公式:[以下将详细说名]
N进制的基数就能表示为:0.1.2......N-2.N-1
N进制的权一般可以表示:N(X)[X是X乘方,X就是某数在它的数列中所处位置]
N进制展开成十进制公试:如abcdefg.hijk=a*N(6)+b*N(5)+c*N(4)+d*(3)+e*(2)+f*N(1)+g*N(0)+h*N(-1)+i*N(-2)+j*N(-3)+k*N(-4)
十进制:有10个基数:0 ~~ 9 ,逢十进一
二进制:有2 个基数:0 ~~ 1 ,逢二进一
八进制:有8个基数:0 ~~ 7 ,逢八进一
十六进制:有16个基数:0 ~~ 9,A,B,C,D,E,F (A=10,B=11,C=12,D=13,E=14,F=15) ,逢十六进一
由于大家从小娃仔开始就学习十进制,生活中用途更是广泛,一种单一的数字思维模式使我们很多人以为就只有这么一种进制数.在以下给大家说说计算机中用得最多的进制数,让大家开阔思维,不要停留于一成不变的思维模式中.
计算机中用得最多也是CPU唯一能认出的数制,那就是二进制.计算机是处理信息的机器,信息处理的前提是信息的表示。计算机内信息的表示形式是二进制数字编码。也就是说,各种类型的信息(数值、文字、声音、图像)必须转换成数字量即二进制数字编码的形式,才能在计算机中进行处理。那怕你移动一下鼠标,按一下键盘,你的每一个动作最后到了CPU那也就只剩0和1了,有时觉得设计计算机的人也太厉害了,就两个数字就能弄出这么完美的东西来,这就是智慧的结晶,其实说到底了CPU也就几百条指令而已,在软件和系统的层层迭加下让我们根本就不了解计算机内部是什么样?其实就是0和1两个状态而已啦.
为什么计算机会采用二进制呢?这是有原因的,也是计算机设计人员考虑到的一个重要因素.计算机内采用二进制的主要原因是:
1. 容易表示
二进制数只有“0”和“1”两个基本符号,易于用两种对立的物理状态表示。例如,可用电灯开关的“闭合”状态表示“1”,用“断开”状态表示“0”;晶体管的导通表示“1”, 截止表示“0”;电容器的充电和放电、电脉冲的有和无、脉冲极性的正与负、电位的高与低等一切有两种对立稳定状态的器件都可以表示二进制的“0”和“1”。而十进制数有1 0个基本符号( 0,1,2,..,9 ),要用1 0种状态才能表示,要用电子器件实现起来是很困难的。
2. 运算简单
二进制数的算术运算特别简单,加法和乘法仅各有3条运算规则( 0+0=0,0+1=1,1+1=1 0和0×0=0,0×1=0,1×1=1 ),运算时不易出错。[其实计算机处理算术运算时都是加法和移位,并没有乘除法,如11B左移一位就成了110B,11B是十进制的5,而110B是10,看看是不是等于乘二,左移乘,右移就除,哈哈,好玩吧]此外,二进制数的“1”和“0”正好可与逻辑值“真”和“假”相对应,这样就为计算机进行逻辑运算提供了方便。算术运算和逻辑运算是计算机的基本运算,采用二进制可以简单方便地进行这两类运算。
二.进制的转换
虽然二进制有不少优点,但毕竟我们日常生活中用的都是十进制,为了能通用,就有必要把它转换为十进制.至于为什么用八进制和十六进制呢?很简单,就是因为它是2的乘方,2(3)=8,2(4)=16,这样一来就便于二进制的计算和阅读.
对于其它进制转换为十进制比较简单,下面举例说明:在此说明一下,一般常用进制有简写,这样是为了不混淆,如十进制一般在末尾加个字母D[一般习惯都不加],二进制加个B,八进制Q,十六进制H.
例如:123D、1101B、123Q、AB9H
123D=1×100+2×10+3×1=123 0.11D=1*10(-1)+1*10(-2)
1011B=(1×8+0×4+1×2+1×1)D=11 0.11B=1*2(-1)+1*(-2)
123Q=(1×64+2×8+3×1)D=83 0.11Q=1*8(-1)+1*8(-2)
AB9H=(10×256+11×16+9×1)D=2745 0.11H=1*16(-1)+1*16(-2)
而十进制转换为其它进制就比较难办了哦,但方法是有的,而且不少方法,在此介绍一种比较常用的,便于大家掌握.
先讲十进制转换为二进制-----
只能举例了,文字说不清的,通常将一个十进制数的整数部分和小数部分分开处理。
1、整数的数制转换;
——采用“基数除法”,具体步骤如下:
(1)将给定的十进制整数除以基数2,余数便是等值的二进制的最低位。
(2)将上一步的商再除以基数2,余数便是等值的二进制数的次低位。
(3)重复步骤2,直到最后所得的商等于0为止。各次除得的余数,便是二进制各位的数,最后一次的余数是最高位
看下面一:
如十进制数267转换图如下:
图一
(267)D=(100001011)B
2、纯小数的数制转换
——采用“基数乘法”,其具体步骤如下:
(1)将给定的十进制纯小数乘以基数2,其积的整数部分便是等值二进制纯小数的最高位。
(2)将上一步中乘积的小数部分再除以基数2,所得乘积的整数部分便是次高位。
(3)重复步骤2,直到乘积的小数部分为0,或者达到要求的精确度为止(舍入误差小于最低位对应的数值)。各次乘积的整数部分便是二进制纯小数的各位,最后一次乘积的整数部分是最低位.
例:将十进制数0.78转换为二进制数。舍入误差小于2-8≈4×10-3
看下图二:
图二
(0.78)D=(0.11000111)B
3、带小数的十进制数转换为二进制数:
——将其整数部分和小数分开计算,即整数部分用基数除法,小数部分用基数乘法,最后合起来。
例:(267.78)D=(100010011.11000111)B
以上方法可归纳为:
整数部分——除2取余;
小数部分——乘2取整。
另外要注意读数的顺序(即高低位的顺序)。十进制转换为其它进制方法一样,在此不多讲了,如不明白可以联系我.下面就十进制267转八进制说说就OK了,看图三
图三
(267)D=(413)Q
小数就比较麻烦了,当然也可以和上面而二进制一样用乘基数取整法,但太麻烦,所以我建议先转化为二进制再转化为八进制,如0.78D要转换成八进制就得先转换为二进制,再转换为八进制.这样就能以二进制为基础进行扩张转换,那就比较清晰了.
其实本人觉得不管什么进制,如不是很大的数,不管三七二十一先转为二进制再讲,二进制再转换就简单得多了. 如
二进制数转换为八进制和十六进制数
1、二进制转换为八进制:
整数部分,从低位开始,小数部分,从高位开始,每三位一组(不够三位的补0),转换为对应的八进制数。
例:(267.78)D=(100 010 011.110 001 11)2=(423.616)Q
267.78
100 010 011.110 001 11[0]-----补个零
4 2 3 . 6 1 6
2、二进制转换为十六进制:
整数部分,从低位开始,小数部分,从高位开始,每四位一组(不够四位的补0),转换为对应的十六进制数。
例:(267.78)D=(1 0001 0011.1100 0111)2=(113.C7)H
八进制和十六进制转换为二进制:
1、八进制转换为二进制:
将八进制数的每一位分别转换为对应的三位二进制数。
例:(643)Q=(110 100 011)
例: (3 7 . 5 6)Q
011 111 . 101 110
(37.56)Q=(11111.10111)B
2、十六进制转换为二进制:
将十六进制数的每一位分别转换为对应的四位二进制数。
例:(3E9D)H=(11 1110 1001 1101)B
例:( 2 A B E)H
0010 1010 1011 1110
(2ABE)Q=(10101010111110)B
把二进制分组是不是简单多了,三位四位的二进制计算量要少了很多,分组也是有规律的,如八进制三位一组,因为八是二的三次方,十六是二的四次方,就分四位为一组,依此类推.以下是各进制对照表:
一)、数制
计算机中采用的是二进制,因为二进制具有运算简单,易实现且可靠,为逻辑设计提供了有利的途径、节省设备等优点,为了便于描述,又常用八、十六进制作为二进制的缩写。
一般计数都采用进位计数,其特点是:
(1)逢N进一,N是每种进位计数制表示一位数所需要的符号数目为基数。
(2)采用位置表示法,处在不同位置的数字所代表的值不同,而在固定位置上单位数字表示的值是确定的,这个固定位上的值称为权。
在计算机中:D7 D6 D5 D4 D3 D2 D1 D0 只有两种0和1
8 4 2 1
二)、数制转换
不同进位计数制之间的转换原则:不同进位计数制之间的转换是根据两个有理数如相等,则两数的整数和分数部分一定分别相等的原则进行的。也就是说,若转换前两数相等,转换后仍必须相等。
有四进制
十进制:有10个基数:0 ~~ 9 ,逢十进一
二进制:有2 个基数:0 ~~ 1 ,逢二进一
八进制:有8个基数:0 ~~ 7 ,逢八进一
十六进制:有16个基数:0 ~~ 9,A,B,C,D,E,F (A=10,B=11,C=12,D=13,E=14,F=15) ,逢十六进一
1、数的进位记数法
N=a n-1*p n-1+a n-2*p n-2+…+a2*p2+a1*p1+a0*p0
2、十进制数与P进制数之间的转换
①十进制转换成二进制:十进制整数转换成二进制整数通常采用除2取余法,小数部分乘2取整法。例如,将(30)10转换成二进制数。
将(30)10转换成二进制数
2| 30 ….0 ----最右位
2 15 ….1
2 7 ….1
2 3 ….1
1 ….1 ----最左位
∴ (30)10=(11110)2
将(30)10转换成八、十六进制数
8| 30 ……6 ------最右位
3 ------最左位
∴ (30)10 =(36)8
16| 30 …14(E)----最右位
1 ----最左位
∴ (30)10 =(1E)16
3、将P进制数转换为十进制数
把一个二进制转换成十进制采用方法:把这个二进制的最后一位乘上20,倒数第二位乘上21,……,一直到最高位乘上2n,然后将各项乘积相加的结果就它的十进制表达式。
把二进制11110转换为十进制
(11110)2=1*24+1*23+1*22+1*21+0*20=
=16+8+4+2+0
=(30)10
把一个八进制转换成十进制采用方法:把这个八进制的最后一位乘上80,倒数第二位乘上81,……,一直到最高位乘上8n,然后将各项乘积相加的结果就它的十进制表达式。
把八进制36转换为十进制
(36)8=3*81+6*80=24+6=(30)10
把一个十六进制转换成十进制采用方法:把这个十六进制的最后一位乘上160,倒数第二位乘上161,……,一直到最高位乘上16n,然后将各项乘积相加的结果就它的十进制表达式。
把十六制1E转换为十进制
(1E)16=1*161+14*160=16+14=(30)10
3、二进制转换成八进制数
(1)二进制数转换成八进制数:对于整数,从低位到高位将二进制数的每三位分为一组,若不够三位时,在高位左面添0,补足三位,然后将每三位二进制数用一位八进制数替换,小数部分从小数点开始,自左向右每三位一组进行转换即可完成。例如:
将二进制数1101001转换成八进制数,则
(001 101 001)2
| | |
( 1 5 1)8
( 1101001)2=(151)8
(2)八进制数转换成二进制数:只要将每位八进制数用三位二进制数替换,即可完成转换,例如,把八进制数(643.503)8,转换成二进制数,则
(6 4 3 . 5 0 3)8
| | | | | |
(110 100 011 . 101 000 011)2
(643.503)8=(110100011.101000011)2
4、二进制与十六进制之间的转换
(1)二进制数转换成十六进制数:由于2的4次方=16,所以依照二进制与八进制的转换方法,将二进制数的每四位用一个十六进制数码来表示,整数部分以小数点为界点从右往左每四位一组转换,小数部分从小数点开始自左向右每四位一组进行转换。
(2)十六进制转换成二进制数
如将十六进制数转换成二进制数,只要将每一位十六进制数用四位相应的二进制数表示,即可完成转换。
例如:将(163.5B)16转换成二进制数,则
( 1 6 3 . 5 B )16
| | | | |
(0001 0110 0011. 0101 1011 )2
(163.5B)16=(101100011.01011011)2