如何将任意进制数转换成十进制?
摘要:本文简要介绍了二进制、八进制、十进制、十六进制,并具体说明了八进制转二进制、十六进制转二进制和十进制转二进制的方法。
进制是一种表示数字的方法,其核心规则是“逢几进一”,比如我们平常说的N进制,实际上就是逢N进一。
一、各进制介绍
(一)二进制
二进制由 0 和 1 组成,逢 2 进 1。其在工程中有以下两种表示形式:
/* 二进制后缀一般用B或b表示 */
1011b
/* 二进制前缀一般用0B或0b表示 */
0B1011
(二)八进制
八进制由 0~7 组成,逢 8 进 1。其在工程中有以下两种表示形式:
/* 八进制后缀一般用O或o表示 */
1234567O
/* 八进制前缀一般用0O或0o表示 */
0O1234567
(三)十进制
十进制由 0~9 组成,逢 10 进1。其在工程中有以下表示形式:
/* 十进制没有前缀,但是有后缀,一般用D或d表示 */
12345D
(四)十六进制
十六进制由 0~F 组成,逢 F 进1。其在工程中有以下表现形式:
/* 十六进制后缀一般用H或h表示 */
345ABCDEFh
/* 十六进制前缀一般用0X或0x表示 */
0x345ABCDEF
二、进制转化
(一)各进制的位权表示法
二进制:
1 0 1 1 0 1b
=1x25 + 0x24 + 1x23 + 1x22 + 0x21 +1x20
=4510
八进制:
0O1 2 3 4 5 6 7
= 1x86 + 2x85 + 3x84 + 4x83 + 5x82 + 6x81 + 7x80
= 34239110
十六进制:
0x 3 A B C D E F
=3x166 + 10x165 + 11x164 + 12x163 + 13x162 + 14x161 + 15x160
=6159102310
(二)十六进制、八进制转二进制
八进制转二进制、十六进制转二进制本质上都是“分组映射”,从 8=23, 16=24这里我们可以看出每一位八进制恰好对应3个二进制位,每一位十六进制恰好对应4个二进制位。其中在进制转换的细节处理中,最容易出错的地方主要集中在补零规则、位宽约束、前导零是否保留以及分组顺序这几方面。
在八进制转二进制中,每一位八进制数(0~7)可直接替换成3位二进制(000~111)。以下是八进制到二进制的映射表:
八进制转二进制映射表
八进制
0
1
2
3
4
5
6
7
二进制
000
001
010
011
100
101
110
111
示例:
八进制 0O 0 1 2 3 4 5 6 7
二进制 = 000 001 010 011 100 101 110 111
在上面示例中,最终的数值有两种写法,一种是000001010011100101110111,另一种则是1010011100101110111,这两种写法的区别只有终值是否将前导0去掉导致最后的位宽表达不同,数值方面并不存在差别。同时单一位八进制数在转换成二进制数的过程中一定要注意转换后的二进制数是 3 位,如果不够三位要补前导0。就比如 2 要写成“010”,而不是“10”。
在十六进制转二进制中,每一位十六进制数(0~F)可直接替换成4位二进制(0000~1111)。以下是十六进制转二进制的映射表:
十六进制转二进制映射表
十六进制
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
二进制
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
示例:
十六进制 0x 3 A B C
二进制 = 0011 1010 1011 1100
在上面示例中,我们可以看出十六进制与八进制在向二进制映射时本质一致,都是基于固定比特宽度的逐位替换。十进制每一位对应 4 bit二进制,不足 4 bit则必须进行前导0补齐。完成映射和拼接后,最终得到的二进制比特序列在数值含义上与八进制转换结果一致,不同之处也仅在于位宽表示是否会被显式保留。
(三)十进制转二进制
十进制转二进制的过程与十六进制转二进制、八进制转二进制不同,因为十进制并不能像十六进制转二进制、八进制转二进制一样可以通过分组映射去转换。目前比较常用的十进制转二进制方法有两种,分别是除2取余法和位权分解法。
1、除2取余法
在除2取余法中任何十进制整数都可以表示为若干个 2 的 幂之和。下面我将通过一个示例来介绍这个方法:
运算商余数
45 ÷ 2
22
1
22 ÷ 2
11
0
11 ÷ 2
5
1
5 ÷ 2
2
1
2 ÷ 2
1
0
1 ÷ 2
0
1
从上面的示例我们可以看出在45不断“除以2”的过程中余数对应当前的最低位(二进制位),除后的商继续参与下一轮除法,并在商为0时结束,最后将运算统计的余数自下而上排列,就可以得到最终的二进制结果1011012。这就是使用除2取余法进行十进制转二进制运算的具体过程。
除2取余法可适用于任意大小的整数,这种方法也是计算机内部转换的基本思路。
2、位权分解法
二进制数本质上是各个2的幂的组合,位权分解法也是牢牢依据此本质去通过下面的公式去计算的:
N = bn2n + bn-12n-1+··· + b020
其中 bi只能取 0 或 1。
下面我将从4510这个示例去解析位权分解法的具体过程和思想:
位权判断结果剩余
2⁵ = 32
45 ≥ 32
1
13
2⁴ = 16
13 < 16
0
13
2³ = 8
13 ≥ 8
1
5
2² = 4
5 ≥ 4
1
1
2¹ = 2
1 < 2
0
1
2⁰ = 1
1 ≥ 1
1
0
通过对2的各个幂次进行比较,可以算出 4510处于 26 = 64 和 25 = 32之间,也就是处于2的6次幂和5次幂之间,按照从小于 4510 的最高次幂取值,可以判断 4510 的二进制表示最高位对应25,总共为6位。从 25 = 32开始判断,45 > 32,该位取1, 然后减去 25 = 32 后按照5次幂依次向下对比,可以看出 24 = 16 是大于13的,剩下的4位继续按照此关系进行计算判断,从小于45的最高次幂开始计1,逐次幂向下对比时,大于余数则计1,小于余数则计0。最后可以得出最后的二进制数计算结果1011012。
在以上两种十进制转二进制方法中可以看出,除2取余法是从低位(LSB)向高位(MSB)逐步构造二进制结果,而位权分解法则是从高位(MSB)向低位(LSB)逐位确定各比特的取值。虽然两种方法的构造方向不同,但是在相同位宽和表示规则下,最终得到的二进制结果是一致的。
