编程基础——进制转换
前言
世界上有10种人,懂二进制的和不懂二进制的。
有同学会问,你说世界上有10种人,为啥只说了两个呢。这里的10可不一定是自然数十,也可能是二进制的一和零,不懂的同学看完这篇文章保证你明明白白(不明白你来打我)。
一、什么是进制
进制就是进位制,是人们规定的一种进位方法。比如X进制,就是每逢X就进一位。二进制是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。一个数值可以在不同的进制之间转换,就是我们接下来要讲的进制转换。
二、二进制转十进制
1.按权相加法
将二进制每一位上的数乘以权,然后加起来的和就是十进制。
权:假设X进制,整数部分的第i位的权是
X
i
−
1
X^{i-1}
Xi−1,小数部分第i位权为
X
−
i
X^{-i}
X−i.
将二进制101.01转换为十进制,示例如下:
1
∗
2
2
+
0
∗
2
1
+
1
∗
2
0
+
0
∗
2
−
1
+
1
∗
2
−
2
=
5.25
1*2^2+0*2^1+1*2^0+0*2^{-1}+1*2^{-2}=5.25
1∗22+0∗21+1∗20+0∗2−1+1∗2−2=5.25
因为0乘任何数都为零,所以我们可以简化一下:
1
∗
2
2
+
1
∗
2
0
+
1
∗
2
−
2
=
5.25
1*2^2+1*2^0+1*2^{-2}=5.25
1∗22+1∗20+1∗2−2=5.25
2.口算法
如果你嫌上面的算法太繁琐,可以练习口算,我个人比较喜欢的一种方法,适合日常计算一些简短的二进制(常用于计算IP地址)。你仔细观察的话会发现上面的公式是有规律的:将二进制位上的数乘以权i,结果是 0 0 0或是 2 i 2^i 2i,这有就像在玩2048游戏。
2048 1024 512 256 128 64 32 16 8 4 2 1
把上面的数背过,有能力的话可以背更多,然后对照起来就可以用简单的加法转换二进制。
举个栗子:
二进制:1 1 0 1 0 1 0 1
对照: 128 64 32 16 8 4 2 1
将二进制1对应位置的数相加,0对应的数忽略,结果为
128
+
64
+
0
+
16
+
0
+
4
+
0
+
1
=
213
128+64+0+16+0+4+0+1=213
128+64+0+16+0+4+0+1=213
三、十进制转二进制
十进制转换二进制时,整数与小数部分转换方法不同,我们可以分开转换,最后再合并一起。
1.整数部分—除二取余法
将整数部分除以2,取余数,商继续除2,直到商为0为止,最终余数倒着写出来就是转换完成的二进制数。
比如将十进制数10,转换为二进制数:
10/2=商5余0
5/2=商2余1
2/2=商1余0
1/2=商0余1
将余数从后到前列出来,就是10的二进制数:1010
2.小数部分—乘二取整法
将小数部分乘以2,取整数部分,剩余小数继续乘以2,直到小数部分为0为止。
比如将十进制小数0.125,转换为二进制数:
0.125*2=0.25 整数部分0
0.25*2=0.5 整数部分0
0.5*2=1 整数部分1
注意小数部分不是逆序取值了,而是顺序,所以0.125的二进制数是:001
3.口算法
跟二进制转十进制的原理是一样的,只不过是反着来而已。用十进制数减参照数(最接近本身数值,又小于等于本身数值的),减的开就得1,减不开就得0,差继续递减参照数。
2048 1024 512 256 128 64 32 16 8 4 2 1
比如我们再把213转回去:
213-128=85 减开得1
85-64=21 减开得1
21-32 减不开得0
21-16=5 减开得1
5-8 减不开得0
5-4=1 减开得1
1-2 减不开得0
1-1 减开得1
最终结果为:1101 0101,是不是和上面一样。
四、二进制转八进制
八进制与二进制的关系: 2 3 = 8 2^3=8 23=8,即用三位二进制数表示一个八进制数。
1.取三合一法
从二进制小数点位置,向左向右每三位取成一位(不足三位补零),将每一位的三个二进制数转换为十进制数,然后按顺序排列,得到的便是八进制数。
如将1101.01转化为八进制:
001 101 . 010
1 5 . 2
最终结果为:15.2
五、八进制转二进制
1.取一分三法
逆行上面的算法,将八进制每一位数分解成三位二进制数,然后去零,便能得到结果。
如将八进制数43.2转换为二进制数:
4 3 . 2
100 011 . 010
最终结果为:100 011.01
六、二进制转十六进制
二进制与十六进制的关系:
2
4
=
16
2^4=16
24=16,即用四位二进制数表示一个十六进制数。相信大家都猜到了,他们的转换方式与八进制的相似。
1.取四合一法
从二进制小数点位置,向左向右每四位取成一位(不足四位补零),将每一位的四个二进制数转换为十进制数,然后按顺序排列,得到的便是十六进制数。
如将二进制数101011.101转换为十六进制:
0010 1011 . 1010
2 B . A
最终结果为:2B.A
七、十六进制转二进制
1.取一分四法
将一位十六进制数分解为四位二进制数,去掉多余的零。
如将十六进制数6E.2转换成二进制数:
6 E . 2
0110 1110 . 0010
110 1110 . 001 \\去零
得到最终结果为:110 1110 . 001
八、十六进制与八进制的转换
十六进制与八进制不能直接转换,可以先将其转换为二进制,再转换为其他进制。
九、八进制、十六进制、十进制之间的转换
1.直接转换
与二进制按权相加法相同,只需改变
X
X
X的值便可。
将
X
X
X进制每一位上的数乘以权,然后加起来的和就是十进制。
权:假设X进制,整数部分的第i位的权是
X
i
−
1
X^{i-1}
Xi−1,小数部分第i位权为
X
−
i
X^{-i}
X−i.
2.间接转换
先将其转换为二进制数,再将二进制数转换为相应进制数即可。
结束语
有的同学刚接触进制转换可能会比较懵逼,甚至不清楚进制的含义,其实只要把二进制弄明白,其余进制的转换就会变得很EZ。
还没看懂的同学先别着急拔刀,让我先跑39米,溜了~