开源,自由,平等,共享,包容,沟通

2008年12月6日星期六

NO.001 - 程序员.数制及转换

 
一、基本概念

  01. 编码

  采用少量的基本符号,选用一定的组合原则,以表示大量复杂多样的信息。
  基本符号的种类和这些符号的组合规则是一切信息编码的两大要素。
 
  02. 进位记数制

  如果只用 r 个基本符号表示数值,则称为 r 进制(radix-r number system);r 称为该数制的基数(radix)。

    特点

    每一种数制都有固定的符号集;
    每一种数制都是用位置表示法(即处于不同位置的数符所代表的值不同,与它所在位置的权值有关)。

  03. 权

  各种进位记数制中的权值就是基数的某次幂。

  对任何一种进位记数制表示的数都可以写成按权展开的多项式之和。

  04. 进位数制公式

    Nr =

二、相关图表

  01. 计算机常用进位数制的表示

进位制二进制八进制十进制十六进制
规则逢二进一逢八进一逢十进一逢十六进一
基数r=2r=8r=10r=16
数符0,10,1,2,3,4,5,6,70,1,2,3,4,5,6,7,8,90,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
2i8i10i16i
表示符BODH

  二进制数中的一个 0 或 1 称为 1 比特(bit)。

  02. 二进制与八进制的对应关系

二进制八进制
0000
0011
0102
0113
1004
1015
1106
1117

  03. 二进制与十六进制的对应关系

二进制十六进制二进制十六进制
0000010008
0001110019
001021010A
001131011B
010041100C
010151101D
011061110E
011171111F

三、数制转换

  01. 二进制数 → 十进制数

  将二进制数的每一位数乘以它的权,然后将所得的全部值相加。

    (100110.101)2
   = 1*25 + 0*24 + 0*23 + 1*22 + 1*21 + 0*20 + 1*2-1 + 0*2-2 + 1*2-3
   = 32 + 0 + 0 + 4 + 2 + 0 + 0.5 + 0 + 0.125
   = (38.625)10

  02. 十进制数 → 二进制数

    a. 整数部分,除 2 取余;小数部分,乘 2 取整;然后合并。

    (37403.2134)10
   => 整数部分推导
   => 37403/2 = 18701 余 1 ↑
   => 18701/2 = 9350 余 1 ↑
   => 9350/2 = 4675 余 0 ↑
   => 4675/2 = 2337 余 1 ↑
   => 2337/2 = 1168 余 1 ↑
   => 1168/2 = 584 余 0 ↑
   => 584/2 = 292 余 0 ↑
   => 292/2 = 146 余 0 ↑
   => 146/2 = 73 余 0 ↑
   => 73/2 = 36 余 1 ↑
   => 36/2 = 18 余 0 ↑
   => 18/2 = 9 余 0 ↑
   => 9/2 = 4 余 1 ↑
   => 4/2 = 2 余 0 ↑
   => 2/2 = 1 余 0 ↑
   => 1/2 = 0 余 1 ↑(最终商为 0 时,逆序开始合并)
   => 1001001000011011
   => 小数部分推导
   => 0.2134*2 = 0.4268 整 0 ↓(顺序开始合并)
   => 0.4268*2 = 0.8536 整 0 ↓
   => 0.8536*2 = 1.7072 整 1 ↓
   => 0.7072*2 = 1.4144 整 1 ↓
   => 0.4144*2 = 0.8288 整 0 ↓
   => 0.8288*2 = 1.6576 整 1 ↓
   => 0.6576*2 = 1.3152 整 1 ↓
   => 0.3152*2 = 0.6304 整 0 ↓(需要提前设定转换精度)
   ......
   => 0.00110110...
   => 合并
   => (1001001000011011.0011011)2

    b. 把一个十进制数写成按二进制数权的大小展开的多项式,并按权值从高到低一次取各项的系数。

    (37403.2134)10
   =

  03. 二进制数 → 八进制数

  从小数点起,把二进制数每 3 位分成一组,然后写出每一组的等值八进制数,顺序排列起来就得到所要求的八进制数。

    (100101001001011101.11010100101)2
   = 100,101,001,001,011,101.110,101,001,100
   = 4 ,5 ,1 ,1 ,3 ,5 .6 ,5 ,1 ,4
   = (451135.6514)8

  04. 八进制数 → 二进制数

  将 1 位八进制数用 3 位二进制数表示。

    (6254172.117002)8
   = 110,010,101,100,001,111,010.001,001,111,000,000,010
   = (110010101100001111010.00100111100000001)2

  05. 十进制数 → 八进制数

  整数部分,除 8 取余;小数部分,乘 8 取整;然后合并。

    (38947164.183593)10
   => 整数部分推导
   => 38947164/8 = 4868395 余 4 ↑
   => 4868395/8 = 608549 余 3 ↑
   => 608549/8 = 76068 余 5 ↑
   => 76068/8 = 9508 余 4 ↑
   => 9508/8 = 1188 余 4 ↑
   => 1188/8 = 148 余 4 ↑
   => 148/8 = 18 余 4 ↑
   => 18/8 = 2 余 2 ↑
   => 2/8 = 0 余 2 ↑(最终商为 0 时,逆序开始合并)
   => 224444534
   => 小数部分推导
   => 0.183593*8 = 1.468744 整 1 ↓(顺序开始合并)
   => 0.468744*8 = 3.749952 整 3 ↓
   => 0.749952*8 = 5.999616 整 5 ↓
   => 0.999616*8 = 7.996928 整 7 ↓
   => 0.996928*8 = 7.975424 整 7 ↓
   => 0.975424*8 = 7.803392 整 7 ↓
   => 0.803392*8 = 6.427136 整 6 ↓
   => 0.427136*8 = 3.417088 整 3 ↓(需要提前设定转换精度)
   ......
   => 0.13577763...
   => 合并
   => (224444534.13577763)8

  06. 八进制数 → 十进制数

  将八进制数的每一位数乘以它的权,然后将所得的全部值相加。

    (674261.173)8
   = 6*85 + 7*84 + 4*83 + 2*82 + 6*81 + 1*80 + 1*8-1 + 7*8-2 + 3*8-3
   = 196608 + 28672 + 2048 + 128 + 48 + 1 + 0.125 + 0.109375 + 0.005859375
   = (227505.240234375)10

  07. 十进制数 → 十六进制数

  整数部分,除 16 取余;小数部分,乘 16 取整;然后合并。

    (92476318.16298)10
   => 整数部分推导
   => 92476318/16 = 5779769 余 14 => E ↑
   => 5779769/16 = 361235 余 9 => 9 ↑
   => 361235/16 = 22577 余 3 => 3 ↑
   => 22577/16 = 1411 余 1 => 1 ↑
   => 1411/16 = 88 余 3 => 3 ↑
   => 88/16 = 5 余 8 => 8 ↑
   => 5/16 = 0 余 5 => 5 ↑(最终商为 0 时,逆序开始合并)
   => 583139E
   => 小数部分推导
   => 0.16298*16 = 2.60768 整 2 => 2 ↓(顺序开始合并)
   => 0.60768*16 = 9.72288 整 9 => 9 ↓
   => 0.72288*16 = 11.56608 整 11 => B ↓
   => 0.56608*16 = 9.05728 整 9 => 9 ↓
   => 0.05728*16 = 0.91648 整 0 => 0 ↓(需要提前设定转换精度)
   ......
   => 0.29B90...
   => 合并
   => (583139E.29B9)16

  08. 十六进制数 → 十进制数

  将十六进制数的每一位数乘以它的权,然后将所得的全部值相加。

    (4DA561B.FE13A)16
   = 4*166 + D*165 + A*164 + 5*163 + 6*162 + 1*161 + B*160 + F*16-1 + E*16-2 + 1*16-3 + 3*16-4 + A*16-5
   = 4*166 + 13*165 + 10*164 + 5*163 + 6*162 + 1*161 + 11*160 + 15*16-1 + 14*16-2 + 1*16-3 + 3*16-4 + 10*16-5
   = 67108864 + 13631488 + 655360 + 20480 + 1536 + 16 + 11 + 0.9375 + 0.0546875 + 0.000244140625 + 0.0000457763671875+0.0000095367431640625
   = 81417755 + 0.9924869537353515625
   = (81417755.9924869537353515625)10

  09. 二进制数 → 十六进制数

  从小数点开始,每 4 位二进制数为一组,将每一组用相应的十六进制数符来表示。

    (1101010111000111110.110101011011001101)2
   = 0110,1010,1110,0011,1110.1101,0101,1011,0011,0100
   = 6 ,A ,E ,3 ,E .D ,5 ,B ,3 ,4
   = (6AE3E.D5B34)16

  10. 十六进制数 → 二进制数

  将 1 位十六进制数用 4 位二进制数表示。

    (AEF34B.2CD9)16
   = 1010,1110,1111,0011,0100,1011.0010,1100,1101,1001
   = (101011101111001101001011.0010110011011001)2

  11. 八进制数 → 十六进制数

  八进制数 → 二进制数 → 十六进制数

  将 1 位八进制数用 3 位二进制数表示;从小数点开始,每 4 位二进制数为一组,将每一组用相应的十六进制数符来表示。

    (7126534.1762354)8
   = 111,001,010,110,101,011,100.001,111,110,010,011,101,100
   = (111001010110101011100.0011111100100111011)2
   = 0001,1100,1010,1101,0101,1100.0011,1111,0010,0111,0110
   = 1 ,C ,A ,D ,5 ,C .3 ,F ,2 ,7 ,6
   = (1CAD5C.3F276)16

  12. 十六进制数 → 八进制数

  十六进制数 → 二进制数 → 八进制数

  将 1 位十六进制数用 4 位二进制数表示;从小数点开始,每 3 位二进制数为一组,将每一组用相应的八进制数符来表示。

    (A013F2.C9DB)16
   = 1010,0000,0001,0011,1111,0010.1100,1001,1101,1011
   = (101000000001001111110010.1100100111011011)2
   = 101,000,000,001,001,111,110,010.110,010,011,101,101,100
   = 5 ,0 ,0 ,1 ,1 ,7 ,6 ,2 .6 ,2 ,3 ,5 ,5 ,4
   = (50011762.623554)8

四、规律总结

  01. 非十进制数 → 十进制数

  将 r 进制数的每一位数乘以它的权 ri,然后将所得的全部值相加。

  02. 十进制数 → 非十进制数

  整数部分(除 r 取余)和小数(乘 r 取整)部分分别转换,然后再合并。
 

没有评论: