【小记】二八十十六,进制团团转
这篇笔记咱主要写一下二进制、八进制、十进制、十六进制之间的互相转换。
Contents
前言
通过观察,我觉得二、八、十、十六进制数的互相转换可以总结为三大块:
- 十进制与其他进制互相转换
- 二进制与其他进制互相转换
- 十六进制与八进制的互相转换
话不多说,下面就按这三大块来归纳一下。
十进制与其他进制的互相转换
十进制到其他进制
整数部分
💡 方法:除以基数倒取余
比如16进制,除以的基数就是16
-
“除以基数”指的是将十进制数不断除以目标进制对应的基数,直到商为
0
为止。 -
“倒取余”指的是将每次相除得到的余数倒序排列,即转换为了目标进制的数。
-
[例] 10进制转换为8进制
图中的红色箭头展示了“倒取余”的过程
图中将十进制数
1145
转换为了八进制数2171
-
[例] 10进制转换为16进制
图中的红色箭头展示了“倒取余”的过程
图中将十进制数
14191
转换为了十六进制数376F
小数部分
⚠ 不是所有的小数都能转换为其他进制。比如现代计算机采用二进制计数,有很多小数都没法准确地转换为二进制(只能取近似值),这也是为什么说现在计算机无法完全准确地表示小数。
💡 方法:乘以基数顺取整
比如2进制,对应的基数就是2
-
“乘以基数”指的是不断将小数部分乘以目标进制对应的基数,直到小数部分为
0
为止。 -
“顺取整”指的是将每次相乘得到的数的整数部分顺序排列,即转换为了目标进制的数。
-
[例] 2进制转换为10进制
图中的红色箭头展示了“顺取整”的过程
图中将十进制数
0.375
转换为了二进制数0.011
其他进制到十进制
💡 方法:每一位数字乘上基数^对应指数
(位权),然后相加求和
本图中的数值
12C.1415926
,是十六进制数。
上图中,基数是16,“对应指数”就是橙色标出的数。以小数点为分界,小数点左侧第一位的对应指数为0
,而小数点右侧第一位的对应指数为-1
。
从低位向高位(图中从右向左),这个指数不断增大。
十六进制的基数是16,那么八进制的基数就是8,以此类推。
-
[例] 16进制转换为10进制
图中将十六进制数
12C.14
转换为了十进制数300.078125
二进制与其他进制的互相转换
二进制和其他进制的互相转换就要方便多了。
二进制到其他进制
💡 方法:以小数点为界,向左右两侧,每几位读为一个数,不足的就补零。
-
关于这里的“每几位”,需要看要转换为哪个进制的数。比如转换为十六进制,其一位能表示
0-F
这16种状态,需要用4个二进制位来表示,那么就是每4位一读。再比如八进制一位能表示
0-7
这8种状态,需要用3个二进制位来表示,那么就是每3位一读。 -
关于补零,无论是从小数点左侧第一位开始往左每几位一读,还是从小数点右侧第一位开始往右每几位一读,都难免遇到“位数不够读”的情况,这个时候就需要补零。
-
[例] 二进制转换为十六进制
图中将二进制数
1001001.011
转换为了十六进制数49.6
- 红色箭头展示了以小数点为分界,分别往左右进行读取。左侧从低位向高位,而右侧从高位向低位。
- 图中括号展示了补零的过程。
100
和011
都不足4位,按照读取方向,分别在其左方和右方补零。 - 最后,每4位一读,用十六进制表示出来,就得到了最后的结果。
-
[例] 二进制转换为八进制
图中将二进制数
1001101.1011
转换为了八进制数115.54
- 具体做法和上面一个例子一致,这里不多赘述。
其他进制到二进制
💡 方法:每位读为几位二进制数。
-
关于这里的“每位读为几位二进制数”,需要看转换前是哪个进制的数。比如原本是十六进制,其一位能表示
0-15
这16种状态,需要用4个二进制位来表示,那么就是每位读为4位二进制数。 -
附一个对照表:
八进制位 ←对应的二进制 十六进制位 ←对应的二进制 0
000
0
0000
1
001
1
0001
2
010
2
0010
3
011
3
0011
4
100
4
0100
5
101
5
0101
6
110
6
0110
7
111
7
0111
– – 8
1000
– – 9
1001
– – A
1010
– – B
1011
– – C
1100
– – D
1101
– – E
1110
– – F
1111
实际应用中,可以根据8421码来进行计算,不用死记硬背。
比如三位二进制
101
, 对应421
,转换为十进制就是4+1=5
。
再比如四位二进制1010
, 对应8421
,转换为十进制就是8+2=10
。
-
[例] 八进制转换为二进制
图中将八进制数
67.23
转换为了二进制数110111.010011
- 每一位八进制位读成3位二进制数(一位八进制位能表达8种状态,需要3位二进制位来表示)
不想用8421码其实也没问题,八进制和十六进制的每一位数其实可以看作是十进制整数,使用除2倒取余的方法能将其逐位展开为二进制数。
(本质上还是按位读取,每位读为几位二进制数)比如上图中,原八进制数中的
6
与3
分别可以用除2倒取余的方法展开为110
与011
,和8421码得出的结果一致。
十六进制与八进制的互相转换
十六进制和八进制之间无法直接转换:
- 如果要把十六进制数转换为八进制数,就需要先将十六进制转换为十进制或二进制,进而再转换为八进制。
- 把八进制转为十六进制也需要用十进制或二进制“过渡一下”
八进制转十六进制的例子
-
通过二进制进行间接转换
上图中我将八进制数
12.450
先转换为了二进制数001010.100101000
,再转换为了十六进制数A.94
。二进制和其他进制互相转换的方法在上面已经介绍过了,这里就不多赘述。
-
通过十进制进行间接转换
上图中我将八进制数
12.450
先转换为了十进制数10.578125
,再转换为了十六进制数A.94
。- 这里再提一嘴:十进制转为其他进制时,需将整数和小数分而治之。
十进制和其他进制互相转换的方法在上面也已经介绍过了,这里就不多赘述。
十六进制转八进制的例子
-
通过二进制进行间接转换
上图中我将十六进制数
C.98
先转换为了二进制数1100.10011000
, 再转换为了八进制数14.46
。可以看到,十六进制转八进制和八进制转十六进制的过程是十分类似的。
-
通过十进制进行间接转换
上图中我将十六进制数
C.98
先转换为了十进制数12.59375
, 再转换为了八进制数14.46
。
冷笑话
这位老伙计为什么要在万圣节前夜穿上圣诞节的服装呢?
答:因为 Oct 31 = Dec 25
。
October(十月) 31 是万圣节前夜,December(十二月) 25 是圣诞节。
但是在这也可以理解成Octal(八进制)31
= Decimal(十进制)25
(*^_^*)