概述
众所周知计算机使用的是二进制,而人类使用的是十进制,因此掌握进制的转换就非常重要了。
在计算机中常用的进制有二进制、八进制、十六进制。
它们之间互相转换需要遵循一定规则来计算。下文将详细介绍其转换的方式。
大体上分为三类:
- 十进制转为非十进制
- 非十进制转为十进制
- 非十进制转为非十进制
十进制转换至非十进制
十进制转换为其他进制,一句话方法:整数部分——除基取余,倒序拼接余数;对于小数部分——乘基取整,正序拼接整数。
整数小数复合的,分别计算后将结果拼接起来即可。整数部分和小数部分略有不同,小数部分是有可能出现无限循环的情况,这是时候就要按照其精度来决定计算多少步,基数指的就是进制。
十进制转换为二进制
整数部分
将十进制数除以2,得到商和余,然后将商继续除以2,得余,以此类推,直到商小于2,然后将每一步的余数倒序的拼接起来,就得到了正确的二进制。设有十进制数:249,计算过程如下:
最终将余数倒序拼接起来,即得到了其二进制数:(11111001)~2~。
小数部分
将十进制数乘以2,然后将整数部分取出来当结果,小数部分继续乘以2,以此类推,直到达到精度或小数变为0时停止,然后将每一步的整数正序拼接就得到了二进制小数。设有十进制数:0.390625,计算过程如下:
最终将整数部分正序拼接,就得到了二进制小数:(0.011001)~2~。注意,别遗漏了小数点。
十进制转换为八进制
计算过程与二进制类似,只不过是基数不同,对其细节不在赘述,只给出计算过程。
整数部分
设有十进制数:250,计算过程如下:
倒序拼接余数,得到八进制数:(372)~8~。
小数部分
设有十进制数:0.53125,计算过程如下:
正序拼接整数,得到八进制小数:(0.42)~8~。
十进制转十六进制
整数部分
设有十进制数:3564,计算过程如下:
倒序拼接余数,得到十六进制数:(DEC)~16~。
小数部分
设有十进制数:0.872802734375,计算过程如下:
正序拼接整数,得到十六进制小数:(0.DF7)~16~。
非十进制转换为十进制
很容易就可以想到这是十进制转为非十进制的逆运算,将非十进制数按位分开,每位分别乘以基数^权值^后相加即可得到结果。
对于整数部分,非十进制数的位数设为n,那么整数的最小位(最右边)的权值为0,最高位(最左边)的权值为n-1。
对于小数部分,非十进制小数的位数设为n,那么小数最高位(最左边)的权值为-1,最低位(最右边)的权值为-n。
对应的,对于混合的数字分别结算后拼接在一起即可。
二进制转换为十进制
整数部分
设有二进制数:101101101,计算过程如下:
得出其结果为:(365)~10~。
小数部分
设有二进制小数:0.10111,计算过程如下:
得出其结果为:(0.71875)~10~。
八进制转换为十进制
整数部分
设有八进制数:672,计算过程如下:
得出其结果为:(442)~10~。
小数部分
设有八进制小数:0.467,计算过程如下:
得出其结果为:(0.607421875)~10~
十六进制转换为十进制
整数部分
设有十六进制数:F7D2,计算过程如下:
得出其结果为:(63442)~10~。
小数部分
设有十六进制小数:0.3FC,计算过程如下:
得出其结果为:(0.2490234375)~10~。
非十进制转换为非十进制
对于2、8、16进制的整数,他们有很便利的对应转换方式。而其他进制,则需要先转换为10进制,再从10进制转换到目标进制,当然其他进制互相转换理论上也应该存在着便利方法,可以探究一下。
二进制、八进制、十六进制互相转换
除了与十进制转换之外,二、八、十六进制互转也是最常使用的转换。因此总结出了一些快捷方法。先来看一个对应关系表:
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
仔细观察,就可以发现,二进制、八进制、十六进制之间有着明显的对应关系。我们可以将二进制数位按组划分来快速计算,这里有句简单的口诀:八四二一。
对于小数同样适用。
二进制与十六进制互相转换
对于整数,将二进制按4位1组从右往左划分,对于小数,将二进制按4位1组从左往右划分,每4位二进制对应十六进制1位,反之亦然,每1位十六进制对应4位二进制。
二进制 | 1 | 1 | 1 | 1 |
---|---|---|---|---|
对应的值 | 8 | 4 | 2 | 1 |
也就是说,如有二进制数:10111000,计算过程如下:
将其分为两组:1011 1000,然后按位转化:
1011 => 8 + 2 + 1 = 11 = B
1000 => 8 = 8
所以十六进制结果是:(B8)~16~。
如果二进制位数不足4位,前补0计算,对于小数而言,方向相反。
如二进制:110111100.011001,加粗部分为所需补的0,计算过程如下:
整数部分:
将其分为三组:1 1011 1100,然后按位转化
0001 => 1 = 1
1011 => 8+2+1 = 11 = B
1100 => 8+4 = 12 = C
小数部分:
将其分为两组(注意方向的不同):0110 01
0110 => 4+2 = 6
0100 => 4
所以十六进制结果是:(1BC.64)~16~。
这个过程反之亦然,所以如有十六进制数:B8,计算过程如下:
B => 11 = 8 + 2 + 1 = 1011
8 => 8 = 1000
所以二进制结果是:(10111000)~2~。
二进制与八进制互相转换
对于整数,将二进制按3位1组从右往左划分,对于小数,将二进制按3位1组从左往右划分,每3位二进制对应八进制1位,反之亦然,每1位十六进制对应4位二进制。
二进制 | 1 | 1 | 1 |
---|---|---|---|
对应的值 | 4 | 2 | 1 |
如有二进制数:11011101.1011101,计算过程如下:
整数部分:
011 => 3
011 => 3
101 => 5
小数部分:
101 => 5
110 => 6
100 => 4
所以八进制结果是:(335.564)~8~。
八进制与十六进制互相转换
为了使用上述两种方便的方式,这个过程相对要多出一步,先将其转换为二进制再进行目标进制的转换。
假设有八进制数:673.26,要转换为十六进制,计算过程如下:
整数部分:
6 => 4+2 = 110
7 => 4+2+1 = 111
3 => 2+1 = 011
小数部分:
2 => 2 = 010
6 => 4+2 = 110
得出二进制中间结果:(110111011.010110)~2~。
接下来转为十六进制:
整数部分划分为:1 1011 1011
0001 => 1
1011 => 8+2+1 = 11 = B
1011 => 8+2+1 = 11 = B
小数部分划分为:0101 10
0101 => 4+1 = 5
1000 => 8
得到十六进制结果为:(1BB.58)~16~。
这个过程反过来也是类似的,不再赘述。
一句题外话:对于三十二进制可以将二进制按5位为1组划分,同样适用于该法则计算。
其他进制的互相转换
只要先将数值转换为十进制,然后按照上述方式转换为目标进制即可。计算比较麻烦,但是用频率较低。