数各进制间的转换

时间:2024-04-07 17:54:24

概述

众所周知计算机使用的是二进制,而人类使用的是十进制,因此掌握进制的转换就非常重要了。

在计算机中常用的进制有二进制、八进制、十六进制。

它们之间互相转换需要遵循一定规则来计算。下文将详细介绍其转换的方式。

大体上分为三类:

  • 十进制转为非十进制
  • 非十进制转为十进制
  • 非十进制转为非十进制

十进制转换至非十进制

十进制转换为其他进制,一句话方法:整数部分——除基取余,倒序拼接余数;对于小数部分——乘基取整,正序拼接整数

整数小数复合的,分别计算后将结果拼接起来即可。整数部分和小数部分略有不同,小数部分是有可能出现无限循环的情况,这是时候就要按照其精度来决定计算多少步,基数指的就是进制。

十进制转换为二进制

整数部分

将十进制数除以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,计算过程如下:

128+027+126+125+024+123+122+021+120

得出其结果为:(365)~10~。

小数部分

设有二进制小数:0.10111,计算过程如下:

121+022+123+124+125

得出其结果为:(0.71875)~10~。

八进制转换为十进制

整数部分

设有八进制数:672,计算过程如下:

682+781+280

得出其结果为:(442)~10~。

小数部分

设有八进制小数:0.467,计算过程如下:

481+682+783

得出其结果为:(0.607421875)~10~

十六进制转换为十进制

整数部分

设有十六进制数:F7D2,计算过程如下:

15163+7162+13161+2160

得出其结果为:(63442)~10~。

小数部分

设有十六进制小数:0.3FC,计算过程如下:

3161+15162+12163

得出其结果为:(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组划分,同样适用于该法则计算。

其他进制的互相转换

只要先将数值转换为十进制,然后按照上述方式转换为目标进制即可。计算比较麻烦,但是用频率较低。