阅读:0       作者:严长生

进制转换:二进制、八进制、十六进制、十进制之间的转换

上一节我们已经讲解了四个常见的数字系统,本节我们将讲解如何把一个数字系统转换成另一个数字系统。

十进制转换成其它进制

整数部分和小数部分的转换算法不同,如果一个十进制数包含了整数部分和小数部分,那么整数部分和小数部分要分开进行转换。按照以下算法,可以将一个十进制数转换成 r 进制数(基数为 r 的数字系统)。

整数部分的转换

  1. 用十进制数的整数部分除以基数 r,得到商和余数,记下余数(第一个余数);
  2. 用得到的商继续除以基数 r,再次得到商和余数,记下余数;
  3. 重复步骤 2,不断用上次得到的商除以基数 r,直到商为零,记下余数(最后一个余数)。

将记下的所有余数按照从后往前的顺序排列起来,就得到了 r 进制数的整数部分。注意,这是一个逆序排列,最后一个余数在最左边,表示 r 进制整数的最高位,第一个余数在最右边,表示 r 进制整数的最低位。

小数部分的转换

  1. 用十进制数的小数部分乘以基数 r,得到一个积,取出积的整数部分(第一个整数);
  2. 用剩下的小数部分继续乘以基数 r,又得到一个积,取出积的整数部分;
  3. 重复步骤 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(最高位)
⇒ (58)10 = (111010)2

2) 小数部分的转换
乘法 整数部分
0.125 x 2 0.25 0(最高位)
0.25 x 2 0.5 0
0.5 × 2 1.0 1(最低位)
⇒ (.125)10 = (.001)2

将整数部分和小数部分合并起来,得到二进制数字 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(最高位)
⇒ (1508)10 = (2744)8

2) 小数部分的转换
乘法 整数部分
0.3125 x 8 2.5 2(最高位)
0.5 x 8 4.0 4(最低位)
⇒ (.3125)10 = (.24)8

将整数部分和小数部分合并起来,得到八进制数字 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(最高位)
⇒ (691780)10 = (A8E44)8

2) 小数部分的转换
乘法 整数部分
0.548828125 x 16 8.78125 8(最高位)
0.78125 x 16 12.5 C
0.5 x 16 8.0 8(最低位)
⇒ (.548828125)10 = (.8C8)16

将整数部分和小数部分合并起来,得到八进制数字 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

所以,二进制 1101.101 转换成十进制的结果是 13.625。

将八进制转换成十进制

以八进制数字 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

所以,八进制 145.23 转换成十进制的结果是 101.3。

将十六进制转换成十进制

以十六进制数字 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

所以,十六进制 1A5.2C 转换成十进制的结果为 421.171875。

二进制、八进制、十六进制之间的转换

这几种数字系统的基数存在次方的关系,转换起来非常简单。

二进制转换成八进制

二进制数的基数是 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

所以,二进制数 101110.01101 转换成八进制的结果为 56.32。

二进制转换成十六进制

这个过程和「二进制转换成八进制」的过程类似。二进制数的基数是 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

所以,二进制数 101110.01101 转换成十六进制的结果为 2D.68。

八进制转换成二进制

这是一个和「二进制转换成八进制」相反的过程,具体步骤为:
  • 将八进制数字的每一位分别转换成一组三位的二进制数字。
  • 按照从左往右的顺序,依次写出每组二进制数字。
  • 整数部分最高位的 0 和小数部分最低位的 0 是多余的,直接去掉。

例子

把八进制数 145.23 转换成二进制数:

(145.23)8 = (001) (100) (101) . (010) (011)2
⇒(145.23)8 = (1100101.010011)2

所以,八进制数字 145.23 转换成二进制的结果为 1100101.010011。

十六进制转换成二进制

这是一个和「二进制转换成十六进制」相反的过程,具体步骤为:
  • 将十六进制数字的每一位分别转换成一组四位的二进制数字。
  • 按照从左往右的顺序,依次写出每组二进制数字。
  • 整数部分最高位的 0 和小数部分最低位的 0 是多余的,直接去掉。

例子

把十六进制数 65.4C 转换成二进制数:

(65.4C)16 = (0110) (0101) . (0100) (1100)2
⇒(65.4C)16 = (1100101.010011)2

所以,十六进制数 65.4C 转换成二进制的结果为 1100101.010011。

八进制转换成十六进制

先将八进制数转换成二进制数,再将二进制数转换成十六进制数。

例子

把八进制数 145.23 转换成十六进制数。

1) 先转换成二进制数:

(145.23)8 = (001) (100) (101) . (010) (011)2
⇒ (145.23)8 = (1100101.010011)2

2) 把得到的二进制数转换成十六进制数:

(1100101.010011)2 = (110) (0101) . (0100) (11)2
 ⇒ (1100101.010011)2 = (0110) (0101) . (0100) (1100)2
 ⇒ (1100101.010011)2 = (65.4C)16

所以,八进制数 145.23 转换成十六进制的结果为 65.4C。 

十六进制转换成八进制

先将十六进制数转换成二进制数,再将二进制数转换成八进制数。

例子

把十六进制数 65.4C 转换成八进制数。

1) 先转换成二进制数:

(65.4C)16 = (0110) (0101) . (0100) (1100)2
⇒ (65.4C)16 = (1100101.010011)2

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

所以,十六进制数 65.4C 转换成八进制的结果为 145.23。