进制转换:二进制、八进制、十六进制、十进制之间的转换
十进制转换成其它进制
整数部分和小数部分的转换算法不同,如果一个十进制数包含了整数部分和小数部分,那么整数部分和小数部分要分开进行转换。按照以下算法,可以将一个十进制数转换成 r 进制数(基数为 r 的数字系统)。整数部分的转换
- 用十进制数的整数部分除以基数 r,得到商和余数,记下余数(第一个余数);
- 用得到的商继续除以基数 r,再次得到商和余数,记下余数;
- 重复步骤 2,不断用上次得到的商除以基数 r,直到商为零,记下余数(最后一个余数)。
将记下的所有余数按照从后往前的顺序排列起来,就得到了 r 进制数的整数部分。注意,这是一个逆序排列,最后一个余数在最左边,表示 r 进制整数的最高位,第一个余数在最右边,表示 r 进制整数的最低位。
小数部分的转换
- 用十进制数的小数部分乘以基数 r,得到一个积,取出积的整数部分(第一个整数);
- 用剩下的小数部分继续乘以基数 r,又得到一个积,取出积的整数部分;
- 重复步骤 2,不断用上次得到的积的小数部分乘以基数 r,直到积的小数部分为零,取出积的整数部分(最后一个整数)。
将取出的所有积的整数部分按照从前往后的顺序排列起来,就得到了 r 进制数的小数部分。注意,这是一个正序排列,第一个整数部分在最左边,表示 r 进制小数的最高位,最后一个整数部分在最右边,表示 r 进制小数的最低位。
将上面得到的 r 进制的整数部分和小数部分合并在一起,就得到了整个 r 进制数。
总结:整数部分的转换就是不断作除法运算,把得到的所有余数逆序排列起来;小数部分的转换就是不断作乘法运算,把得到的所有积的整数部分正序排列起来。
十进制数转换成二进制数
十进制数转换成二进制数的过程可以分成以下两步:- 整数部分不断除以基数 2,直到商为零,把得到的余数逆序排列起来;
- 小数部分不断乘以基数 2,直到积的小数部分为零,把得到的积的整数部分正序排列起来。
例子
以 58.125 为例,它的整数部分是 58,小数部分是 0.125。1) 整数部分的转换:
除法 | 商 | 余数 |
---|---|---|
58/2 | 29 | 0 (最低位) |
29/2 | 14 | 1 |
14/2 | 7 | 0 |
7/2 | 3 | 1 |
3/2 | 1 | 1 |
1/2 | 0 | 1(最高位) |
2) 小数部分的转换
乘法 | 积 | 整数部分 |
---|---|---|
0.125 x 2 | 0.25 | 0(最高位) |
0.25 x 2 | 0.5 | 0 |
0.5 × 2 | 1.0 | 1(最低位) |
将整数部分和小数部分合并起来,得到二进制数字 111010.001,也即:
(58.125)10 = (111010.001)2
十进制转换成八进制
十进制数转换成八进制数的过程可以分成以下两步:- 整数部分不断除以基数 8,直到商为零,把得到的余数逆序排列起来;
- 小数部分不断乘以基数 8,直到积的小数部分为零,把得到的积的整数部分正序排列起来。
例子
以 1508.3125 为例,它的整数部分是 1508,小数部分是 0.3125。1) 整数部分的转换:
除法 | 商 | 余数 |
---|---|---|
1508/8 | 188 | 4 (最低位) |
188/8 | 23 | 4 |
23/8 | 2 | 7 |
2/8 | 0 | 2(最高位) |
2) 小数部分的转换
乘法 | 积 | 整数部分 |
---|---|---|
0.3125 x 8 | 2.5 | 2(最高位) |
0.5 x 8 | 4.0 | 4(最低位) |
将整数部分和小数部分合并起来,得到八进制数字 2744.24,也即:
(1508.3125)10 = (2744.24)8
十进制转换成十六进制
十进制数转换成十六进制数的过程可以分成以下两步:- 整数部分不断除以基数 16,直到商为零,把得到的余数逆序排列起来;
- 小数部分不断乘以基数 16,直到积的小数部分为零,把得到的积的整数部分正序排列起来。
例子
以 691780.548828125 为例,它的整数部分是 691780,小数部分是 0.548828125。1) 整数部分的转换:
除法 | 商 | 余数 |
---|---|---|
691780/16 | 43236 | 4 (最低位) |
43236/16 | 2702 | 4 |
2702/16 | 168 | E |
168/16 | 10 | 8 |
10/16 | 0 | A(最高位) |
2) 小数部分的转换
乘法 | 积 | 整数部分 |
---|---|---|
0.548828125 x 16 | 8.78125 | 8(最高位) |
0.78125 x 16 | 12.5 | C |
0.5 x 16 | 8.0 | 8(最低位) |
将整数部分和小数部分合并起来,得到八进制数字 A8E44.8C8,也即:
(691780.548828125)10 = (A8E44.8C8)16
其它进制转换成十进制
任何一种进制转换成十进制的算法都是一样的,就是“按权相加”。将 r 进制转换成十进制可以分以下两步进行:- 将每一位的数码乘以该位的权重;
- 把得到的所有积相加。
将二进制转换成十进制
以二进制数字 1101.101 为例,它在数学上可以写作:
(1101.101)2 = (1 × 23) + (1 × 22) + (0 × 21) + (1 × 20) + (1 × 2-1) + (0 × 2-2) + (1 × 2-3)
⇒ (1101.11)2 = 8 + 4 + 0 + 1 + 0.5 + 0 + 0.125 = 13.625
⇒ (1101.11)2 = (13.625)10
将八进制转换成十进制
以八进制数字 145.23 为例,它在数学上可以写作:
(145.23)8 = (1 × 82) + (4 × 81) + (5 × 80) + (2 × 8-1) + (3 × 8-2)
⇒ (145.23)8 = 64 + 32 + 5 + 0.25 + 0.05 = 101.3
⇒ (145.23)8 = (101.3)10
将十六进制转换成十进制
以十六进制数字 1A5.2C 为例,它在数学上可以写作:
(1A5.2C)16 = (1 × 162) + (10 × 161) + (5 × 160) + (2 × 16-1) + (12 × 16-2)
⇒ (1A5.2C)16 = 256 + 160 + 5 + 0.125 + 0.046875 = 421.171875
⇒ (1A5.2C)16 = (421.171875)10
二进制、八进制、十六进制之间的转换
这几种数字系统的基数存在次方的关系,转换起来非常简单。二进制转换成八进制
二进制数的基数是 2,八进制数的基数是 8,因为23 = 8,所以每三位二进制数可以转换成一位八进制数。将二进制数转换成八进制数的步骤为:
- 对二进制数进行划分,每三位为一组,整数部分从右往左进行划分,小数部分从左往右进行划分。
- 不足三位时,整数部分高位用 0 补齐,小数部分低位用 0 补齐。
- 按照从左往右的顺序,依次写出每组二进制数对应的八进制数。
每组二进制数都有八种不同的组合,分别对应不同的八进制数字,如下所示:
000 = 0 001 = 1 010 = 2 011 = 3
100 = 4 101 = 5 110 = 6 111 = 7
例子
把二进制数 101110.01101 转换成八进制数:
(101110.01101)2 = (101) (110) . (011) (01)2
⇒ (101110.01101)2 = (101) (110) . (011) (010)2
⇒ (101110.01101)2 = (56.32)8
二进制转换成十六进制
这个过程和「二进制转换成八进制」的过程类似。二进制数的基数是 2,十六进制数的基数是 16,因为24 = 16,所以每四位二进制数可以转换成一位十六进制数。将二进制数转换成十六进制数的步骤为:
- 对二进制数进行划分,每四位为一组,整数部分从右往左进行划分,小数部分从左往右进行划分。
- 不足四位时,整数部分高位用 0 补齐,小数部分低位用 0 补齐。
- 按照从左往右的顺序,依次写出每组二进制数对应的十六进制数。
每组二进制数都有十六种不同的组合,分别对应不同的十六进制数字,如下所示:
0000 = 0 0001 = 1 0010 = 2 0011 = 3
0100 = 4 0101 = 5 0110 = 6 0111 = 7
1000 = 8 1001 = 9 1010 = A 1011 = B
1100 = C 1101 = D 1110 = E 1111 = F
例子
把二进制数 101110.01101 转换成十六进制数:
(101110.01101)2 = (10) (1110) . (0110) (1)2
⇒ (101110.01101)2 = (0010) (1110) . (0110) (1000)2
⇒ (101110.01101)2 = (2D.68)16
八进制转换成二进制
这是一个和「二进制转换成八进制」相反的过程,具体步骤为:- 将八进制数字的每一位分别转换成一组三位的二进制数字。
- 按照从左往右的顺序,依次写出每组二进制数字。
- 整数部分最高位的 0 和小数部分最低位的 0 是多余的,直接去掉。
例子
把八进制数 145.23 转换成二进制数:
(145.23)8 = (001) (100) (101) . (010) (011)2
⇒(145.23)8 = (1100101.010011)2
十六进制转换成二进制
这是一个和「二进制转换成十六进制」相反的过程,具体步骤为:- 将十六进制数字的每一位分别转换成一组四位的二进制数字。
- 按照从左往右的顺序,依次写出每组二进制数字。
- 整数部分最高位的 0 和小数部分最低位的 0 是多余的,直接去掉。
例子
把十六进制数 65.4C 转换成二进制数:
(65.4C)16 = (0110) (0101) . (0100) (1100)2
⇒(65.4C)16 = (1100101.010011)2
八进制转换成十六进制
先将八进制数转换成二进制数,再将二进制数转换成十六进制数。例子
把八进制数 145.23 转换成十六进制数。1) 先转换成二进制数:
(145.23)8 = (001) (100) (101) . (010) (011)2
⇒ (145.23)8 = (1100101.010011)2
(1100101.010011)2 = (110) (0101) . (0100) (11)2
⇒ (1100101.010011)2 = (0110) (0101) . (0100) (1100)2
⇒ (1100101.010011)2 = (65.4C)16
十六进制转换成八进制
先将十六进制数转换成二进制数,再将二进制数转换成八进制数。例子
把十六进制数 65.4C 转换成八进制数。1) 先转换成二进制数:
(65.4C)16 = (0110) (0101) . (0100) (1100)2
⇒ (65.4C)16 = (1100101.010011)2
(1100101.010011)2 = (1) (100) (101) . (010) (011)2
⇒ (1100101.010011)2 = (001) (100) (101) . (010) (011)2
⇒ (1100101.010011)2 = (145.23)8