各进制及其转换详解

昨天学习操作系统内存分配的时候,遇到十六进制转换二进制的问题,工作几年,大学的知识都忘了。特地整理复习一下

进位制

百度百科:

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十
进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

维基百科:

进位制是一种记数方式,亦称进位计数法或位值计数法。利用这种记数法,可以使用有限种数字符号来表示所有的数值。一种进位制中可以使用的数字符号的数目称为这种进位制的基数或底数。若一个进位制的基数为n,即可称之为n进位制,简称n进制。
现在最常用的进位制是十进制,这种进位制通常使用10个阿拉伯数字(即0-9)进行记数。

进位(进位计数)

任何进制,都有进位的说法(以位数增加即数量增加来弥补种类的不足),二进制的满2进一,十进制的满10进一等等,就比如对于二进制01后一位不是02,因为只有0和1两种符号,所以进位变成10,同样,八进制的57 后面不是58而是60。因此,使用有限个数
码来表示数据,按进位的方法进行计数,称之为进位计数。

以十进制为例:
十进制中采用0,1,2,3,4,5,6,7,8,9这是个数字表示数据,逢十向相邻高位进一,每一位的位权都是以10为底的指数函数,由小数点向左依次是100,101,102,103,104...... 由小数点向右一次是10-1,10-2.....

N=an * 10n + an-1 * 10n-1 + ......................................+ a1 * 101 + a0 * 100 + a-1 * 10-1 ...................................... + a-m * 10-m

二进制

二进制和十进制相仿,也是一种计数制,它只使用0和1两个不同的数字符号才用逢二进一,如二进制数(10111.101)2
计算机中为什么才用二进制呢

  • 状态稳定,容易实现
  • 运行规则简单
  • 可将逻辑处理与算数处理结合

不同进位数之间的转换

  • 其他进制转换为十进制


    通常采用按位展开,按权相乘法
    1. 二进制转化为十进制
    例: (10111.101)2 转化为10进制
    10111.101 = 1 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 1 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 = 23.625


    2. 八进制转化为十进制
    方法与二进制转化为十进制一样,仅仅是基数不同
    例: (24.67)8 转化为10进制
    24.67 = 2 * 81 + 4 * 80 + 6 * 8-1 + 7 * 8-2 = 20.859375


    (452.362)8 转化为10进制
    452.362 = 4 * 82 + 5 * 81 + 2 * 80 + 3 * 8-1 + 6 * 8-2 + 2 * 8-3 = 298.47265625


    3.十六进制转化为十进制
    十六进制共有16个不同的符号:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,A表示10,B表示11 以此类推 F表示16,转换方法同前,仅仅是将基数变为16
    例: (2AB.C)16 转化为10进制
    2AB.C = 2 * 162 + A * 161 + B * 160 + C * 16-1 = 2 * 162 + 10 * 161 + 11 * 160 + 12 * 16-1 = 683.75


    (A7D.E)16 转化为10进制
    A7D.E = A * 162 + 7 * 161 + D * 160 + E * 16-1 = 10 * 162 + 7 * 161 + 13 * 160 + 14 * 16-1 = 2685.875


    4. 其他进制转化为十进制
    其他进制转化为十进制可类似进行,如四进制,七进制,十二进制,二十四进制,三十二进制,只需改变基数即可

  • 其他进制转化为二进制数


    1. 十进制转化为二进制


    通常采用"除以二逆向取余法"
    例: 将(57)10 转化为二进制
    2 57 ......1
    2 28 ......0
    2 14 ......0
    2 7 ......1
    2 3 ......1
    2 1 ......1(高位)
    0
    (57)10 = (111001)2


    2. 十进制小数转化为二进制小数


    通常采用“乘以二顺向取整法”,把给定的十进制小数不断乘以2,取乘积的整数部分作为二进制小数的最高位,然后把乘积小数部分再乘以2,取乘积的整数部分,得到二进制小数的第二位,如此不断重复,得到二进制小数的其他位。
    例 将(0.875)10 转化为二进制小数
    0.875 * 2 = 1.75 .....1 (高位)
    0.75 * 2 = 1.5 .....1
    0.5 * 2 = 1 .....1
    (0.875)10 = (0.111)2


    例 将(0.6875)10 转化为二进制小数
    0.6875 * 2 = 1.375 .....1 (高位)
    0.375 * 2 = 0.75 .....0
    0.75 * 2 = 1.5 .....1
    0.5 * 2 = 1 .....1
    (0.6875)10 = (0.1011)2


    对于既有整数又有小数部分的十进制数,只需将整数部分和小数部分转化为二进制即可
    例 将(215.675)10 转化为二进制小数
    2 215........1
    2 107........1
    2 53.........1
    2 26.........0
    2 13.........1
    2 6..........0
    2 3..........1
    2 1..........1(高位)
    0
    (215)10 = (11010111)2


    0.675 * 2 = 1.35 ......1
    0.35 * 2 = 0.7 ......0
    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
    0.4 * 2 = 0.8 ......0
    0.8 * 2 = 1.6 ......1
    0.6 * 2 = 1.2 ......1
    0.2 * 2 = 0.4 ......0
    ....................
    (0.675)10 = (0.101011001100110011.....)2,是个循环小数
    即(215.675)10 = (11010111.101011001100110011.....)2 无法用二进制表示 只能按精度取


    3. 八进制数转化为二进制
    把每一个八进制数字改写为等值的三位二进制数,并保持高低位次序不变即可
    例:(0.754)8 转换为二进制
    (0.754)8 = (000.111 101 100)2 = (0.1111011)2


    例:(16.327)8 转换为二进制
    (16.327)8 = (001 110. 011 010 111 )2 = (1110.011010111)2


    3. 十六进制数转化为二进制
    把每一个八进制数字改写为等值的四位二进制数,并保持高低位次序不变即可
    例:(4C.2E)16 转换为二进制
    (4C.2E)16 = (0100 1100.0010 1110)2 = (1001100.0010111)2


    例:(AD.7F)16 转换为二进制
    (AD.7F)16 = (1010 1101.0111 1111)2 = (10101101.01111111)2

  • 二进制转化为其他进制数
    1. 二进制转化为八进制数
    将整数部分从低位向高位每三位用一个等值的八进制数来替换,最后不足三位时在高位补0凑满三位,小数部分从高位向低位每三位用一个等值的八进制数来替换,最后不足三位时在低位补0凑满三位
    例: (0.10111)2 = (000.101 110)2 = (0.56)8
    例: (11101.01)2 = (011 101.010 )2 = (35.2)8
    2. 二进制转化为十六进制
    将整数部分从低位向高位每四位用一个等值的十六进制数来替换,最后不足四位时在高位补0凑满三位,小数部分从高位向低位每四位用一个等值的十六进制数来替换,最后不足四位时在低位补0凑满四位
    例: (11101.01)2 = (0001 1101.0100)2 = (1D.4)16
    例: (101011101.011)2 = (0001 0101 1101.0110)2 = (15D.6)16

附: 2的次方对照表

  • 2^-7 = 0.0078125

  • 2^-6 = 0.015625

  • 2^-5 = 0.03125

  • 2^-5 = 0.03125

  • 2^-4 = 0.0625

  • 2^-3 = 0.125

  • 2^-2 = 0.25

  • 2^-1 = 0.5

  • 2^0 = 1

  • 2^1 = 2

  • 2^2 = 4

  • 2^3 = 8

  • 2^4 = 16

  • 2^5 = 32

  • 2^6 = 64

  • 2^7 = 128

  • 2^8 = 256

  • 2^9 = 512

  • 2^10 = 1024

  • 2^11 = 2048

  • 2^12 = 4096

  • 2^13 = 8192

  • 2^14 = 16384

  • 2^15 = 32768

  • 2^16 = 65536

  • 2^17 = 131072

  • 2^18 = 262144

  • 2^19 = 524288

  • 2^20 = 1048576

  • 2^21 = 2097152

  • 2^22 = 4194304

  • 2^23 = 8388608

  • 2^24 = 16777216

  • 2^25 = 33554432

  • 2^26 = 67108864

  • 2^27 = 134217728

  • 2^28 = 268435456

  • 2^29 = 536870912

  • 2^30 = 1073741824

  • 2^31 = 2147483648

  • 2^32 = 4294967296

  • 2^33 = 8589934592

  • 2^34 = 17179869184

  • 2^35 = 34359738368

  • 2^36 = 68719476736

  • 2^37 = 137438953472

  • 2^38 = 274877906944

  • 2^39 = 549755813888

  • 2^40 = 1099511627776

  • 2^41 = 2199023255552

  • 2^42 = 4398046511104

  • 2^43 = 8796093022208

  • 2^44 = 17592186044416

  • 2^45 = 35184372088832

  • 2^46 = 70368744177664

  • 2^47 = 140737488355328

  • 2^48 = 281474976710656

  • 2^49 = 562949953421312

  • 2^50 = 1125899906842624

  • 2^51 = 2251799813685248

  • 2^52 = 4503599627370496

  • 2^53 = 9007199254740992

  • 2^54 = 18014398509481984

  • 2^55 = 36028797018963968

  • 2^56 = 72057594037927936

  • 2^57 = 144115188075855872

  • 2^58 = 288230376151711744

  • 2^59 = 576460752303423488

  • 2^60 = 1152921504606846976

  • 2^61 = 2305843009213693952

  • 2^62 = 4611686018427387904

  • 2^63 = 9223372036854775808

  • 2^64 = 18446744073709551616

posted @ 2021-01-07 13:52  Felix-Zhang  阅读(3917)  评论(0编辑  收藏  举报