首页 > C语言教程 > 计算机基础 阅读数:60

进制转换方法汇总

我们在小学算术中学过,十进制数的个位(从右向左第 1 位)上的 1 表示数值 1,十位(从右向左第 2 位)上的 1 表示数值 10,百位(从右向左第 3 位)上的 1 表示数值 100,千位(从右向左第 4 位)上的 1 表示数值 1000,依此类推,从右向左第 n 位上的 1 表示的数值是 10n-1。我们把一个数从右向左第 n 位上的 1 所表示的数值大小称为该数位上的位权。

表 1 列出了十进制数、二进制数、八进制数和十六进制数各个数位上的位权大小。

表 1:各个数位上的权值
计数法 从右向左第 n 位上的 1 表示的数值(位权)
第 n 位 …… 第 5 位 第 4 位 第 3 位 第 2 位 第 1 位
十进制 10n-1 …… 10000 1000 100 10 1
二进制 2n-1 …… 16 8 4 2 1
八进制 8n-1 …… 4096 512 64 8 1
十六进制 16n-1 …… 65536 4096 256 16 1

其它进制转换成十进制

一个十进制数所表示的数值大小就等于各个数位上的位权乘以该数位上的值(0~9)再相加得到的总和。例如:

9504=1000×9+100×5+10×0+1×4


二进制数也是同样的原理。二进制数从右向左第 1 位上的 1 表示数值 1(20),第 2 位上的 1 表示数值 2(21),第 3 位上的1表示数值 4(22),第 4 位上的 1 表示数值 8(23),依此类推,从右向左第 n 位上的 1 表示的数值是 2n-1

二进制数各位的位权与各位上的值(0 或 1)的乘积的总和就是这个二进制数所对应的十进制数(见图 1)。例如把二进制数 101011 转换为十进制数就是:

25×1+24×0+23×1+22×0+21×1+20×1=32+0+8+0+2+1=43


二进制数转换为十进制数(位权 2n-1 的利用)
图 1:二进制数转换为十进制数(位权 2n-1 的利用)

同理,八进制数各位的位权(8n-1)与各位上的值(0~7)的乘积的总和就是这个八进制数所对应的十进制数(见图 2)。例如把八进制数 1753 转换为十进制数就是:

83×1+82×7+81×5+80×3=512+448+40+3=1003


八进制数转换为十进制数(位权 8n-1 的利用)
图 2:八进制数转换为十进制数(位权 8n-1 的利用)

十六进制数各位的位权(16n-1)与各位上的值(0~F)的乘积的总和就是这个十六进制数所对应的十进制数(见图 3)。例如把十六进制数 27DB 转换为十进制数就是:

163×2+162×7+161×13+160×11=8192+1792+208+11=10203


十六进制数转换为十进制数(位权16n-1的利用)
图 3:十六进制数转换为十进制数(位权 16n-1 的利用)

十进制转换成其它进制

利用二进制数各位的位权,可以把一个二进制数转换为十进制数,那么如果要知道十进制数所对应的二进制数是多少,该怎么办呢?

我们通常使用辗转相除求余法来得到一个十进制数所对应的二进制数,具体的操作步骤如下:(见图 4)
  1. 用 2 去除十进制数,得到商和余数,这个余数就是对应的二进制数从右向左第 1 位的值;
  2. 然后把商作为被除数继续用 2 去除,又得到一个商和余数,此时的余数就是对应的二进制数从右向左第 2 位的值;
  3. 再次把得到的第二个商作为被除数继续用 2 除,得到第三个商和余数,这时的余数就是对应的二进制数从右向左第 3 位的值;
  4. 像这样把每次得到的商作为被除数用 2 除,获取余数,直到商为 0;
  5. 最后把得到的所有余数从右向左依次排列就是这个十进制数对应的二进制数。

把十进制数转换为二进制数的步骤
图 4:把十进制数转换为二进制数的步骤

同样的原理,用 8 作为除数对一个十进制数进行辗转相除,把得到的所有余数从右向左依次排列,可以得到这个十进制数对应的八进制数(见图 5)。

把十进制数转换为八进制数的步骤
图 5:把十进制数转换为八进制数的步骤

用 16 作为除数对一个十进制数进行辗转相除,把得到的所有余数从右向左依次排列,可以得到这个十进制数对应的十六进制数(见图 6)。

把十进制数转换为十六进制数的步骤
图 6:把十进制数转换为十六进制数的步骤

二进制和八进制/十六进制之间的转换

当把二进制数转换为八进制数或十六进制数时,可以先把二进制数转换为十进制数,然后再把这个十进制数转换为八进制数或十六进制数;反过来,八进制数或十六进制数转换为二进制数时,则先把它转化为十进制数,再把这个十进制数转换为二进制数;八进制数与十六进制数之间的相互转换也是如此。

除此之外,我们也可以利用前面讲过的各个数位上的位权,把二进制数直接转换为八进制数或十六进制数。要进行这种直接转换需要了解二进制数与八进制数、十六进制数之间的特殊关系:

1) 八进制数的各位可以取 0~7 这几个值,这正好是用 3 位二进制数(000~111)能表示的值(见表 2):

表 2:二进制数与八进制数对应表
二进制数 000 001 010 011 100 101 110 111
八进制数 0 1 2 3 4 5 6 7

2) 十六进制数的各位可以取 0~F 这几个值,这正好是用 4 位二进制数(0000~1111)能表示的值(见表 3):

表 3:二进制数与十六进制数对应表
二进制数 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
十六进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F

因此我们可以总结出下面的特殊关系:二进制数的 3 位相当于八进制数的 1 位,二进制数的 4 位相当于十六进制数的 1 位。

所以当把二进制数转换为八进制数时,可以从低位起(从右向左)把二进制数划分为每 3 位一个区间,再把每个区间内的 3 位二进制数转换为对应的十进制数,这样最终得到的数就是这个二进制数对应的八进制数。当把二进制数转换为十六进制数时,可以从低位起(从右向左)把二进制数划分为每 4 位一个区间,再把每个区间内的 4 位二进制数转换为对应的十进制数(10~15 用 A~F 表示),这样最终得到的数就是这个二进制数对应的十六进制数(见图 7)。

把二进制数转换为八进制数、十六进制数的步骤
图 7:把二进制数转换为八进制数、十六进制数的步骤

反过来,把八进制数转换为二进制数时,将八进制数的各位变换为 3 位二进制数,就得到了这个八进制数对应的二进制数;把十六进制数转换为二进制数时,将十六进制数的各位变换为 4 位二进制数,就得到了这个十六进制数对应的二进制数(见图 8)。

把八进制数、十六进制数转换为二进制数的步骤
图 8:把八进制数、十六进制数转换为二进制数的步骤

总结

  1. 3 位二进制数的值正好能用 1 位八进制数来表示。
  2. 4 位二进制数的值正好能用 1 位十六进制数来表示。
  3. 各位的位权与各位上的值的乘积的总和就是这个数所对应的十进制数。
  4. 在二进制数中,从右向左第 n 位拥有 2n-1(2 的 n-1 次方)的“位权”。
  5. 在八进制数中,从右向左第 n 位拥有 8n-1(8 的 n-1 次方)的“位权”。
  6. 用 2 除十进制数时得到的余数就是十进制数所对应的二进制数各位的值。
  7. 用 8 除十进制数时得到的余数就是十进制数所对应的八进制数各位的值。
  8. 用 16 除十进制数时得到的余数就是十进制数所对应的十六进制数各位的值。
  9. 在十六进制数中,从右向左第 n 位拥有 16n-1(16 的 n-1 次方)的“位权”。
  10. 在 C语言中如果一个数以 0 开头,表示这是一个八进制数。比如 025 表示 25 是一个八进制数。
  11. 在 C语言中如果一个数以 0x 开头,表示这是一个十六进制数。比如 0x45 表示 45 是一个十六进制数。