浅谈进制转换

发布于 2020-12-21  181 次阅读


食用前提示:本文搬自作者的洛谷博客。

浅谈进制转换

不要问我为什么写这篇博客,问就是不告诉你。
——$qty$

二进制->十进制:

二进制转十进制的方法:按权展开

看名字可能不太好理解。

先来解释一下是什么:权又叫做位权,也就是每一位的权值。

举个栗子:十进制数的百位、十位、个位、十分位(小数点右一位)的权分别是 $10^2$、$10^1$、$10^0$,$10^{-1}$(也就是 $\frac{1}{10}$ )。
那么二进制也是同理:一个二进制数从右往左数,小数点左边第一位的权是$2^0$,第二位的权是$2^1$,第三位是$2^2$,小数点右边第一位是$2^{-1}$ ( $=\frac{1}{2}$ ) 。

这个没有问题的话我们就来顾名思义:
按照权来展开。对于一个二进制数,我们把它每一位的权乘上每一位的值,最终的结果就是它在十进制下的值了。

比如,$(10101)2=1*2^0+0*2^1+1*2^2+0*2^3+1*2^4=(21){10}$

(按照习惯我们一般从右往左算)

PS:(右下角的标识表示代表了它的进制,如 $(10101)_2$ 就代表二进制下的 $10101$ 。)

Practice makes perfect. 读者不妨自己随手写几个二进制数,转化转化看看。至于怎么验证正确,计算机的程序员模式了解一下(实在不行你上网百度几道题目也行)。这种东西没有什么技巧,做多了就熟练了。


那么对于三进制数,我们也是同理,只不过这里每一位的权变成了 $3$ 的幂而已。

比如: $(201)3=1*3^0+0*3^1+2*3^2=(19){10}$


那么根据类比思想,对于有小数的部分我们也很好想了,还是来看看权:前文我们提到了十进制数的十分位的权是 $10^{-1}$ ,那么同理,我们可以得到: 对于一个a进制数,它的小数点右第b位的权就是$a^{-b}$,也就是$\frac{1}{a^b}$。

所以我们就不难理解了,以下是一个例子:

$(1010.101)2=1*2^{-3}+0*2^{-2}+1*2^{-1}+0*2^0+1*2^1+0*2^2+1*2^3=(10.625){10}$

十进制->二进制:

这里我们使用除二倒取余的方法。

这个方法用文字不太好叙述,我们这里直接举例子吧。 比如我们要求$(13)_{10}$在二进制下的值,那么如图:

我们可以不断把 $13$ 整除 $2$ ,把得到的余数列在旁边,最后剩下一个 $1$ ,把这个 $1$ 作为开头,从下往上把旁边一列的数写成一串,就是我们的答案了,也就是:$(13)_{10}=(1101)_2$。


接下来是十进制小数转化成二进制小数,我们也有一个方法,而且名字和上面的还挺般配:乘二正取整

整数部分和上面的一样,对于小数部分,我们不断把它乘以2,取整数部分依次从左往右放在小数点后,直到小数部分为0即可。

我们来看一个例子:把 $(0.125)_{10}$ 转换为二进制。

  1. 将小数部分$0.125$乘以2,得 $0.25$ ,然后取整数部分 $0$ 。

  2. 再将小数部分 $0.25$ 乘以 $2$ ,得 $0.5$ ,然后取整数部分 $0$ 。

  3. 再将小数部分 $0.5$ 乘以 $2$,然后取整数部分 $1$ ,此时小数部分为 $0$ ,过程结束。

  4. 把每次处理得到的结果正着写,得到的二进制的结果就是 $0.001$ 。

二进制,八进制,十六进制之间的转换

掌握了以上内容,相信一般的题目对于你已经没有障碍了。不过有时候题目要求我们在二进制,八进制,十六进制之间转换,这时候我们虽然可以把给出的数转化成十进制然后再把它转化成其他进制,但这样太麻烦,我们需要一种更简便的方法。


先给出一个口诀:三位二进制等于一位八进制,四位二进制等于一位十六进制。 注意这里的三位是指从小数点开始向左或者向右连续的三位,如果不足三位就往外侧补 $0$ (即,在小数点左侧缺少位数就在开头补 $0$ ,在小数点右侧缺少位数就在结尾补 $0$ )。

为什么可以这么说呢?以三位二进制等于一位八进制为例。先来证明在开头或者结尾补 $0$ 不会影响数值。我们来看看一个数的值怎么算:按权展开(比如$(14)_{10}=4*10^0+1*10^1$)。那么我们可以发现不管在前面和后面加上多少个 $0$ ,对于加上的每一个 $0$ ,它的该位上的值都是 $0$ ,乘上任何一个权,结果都为 $0$ ,所以不会改变数的值。

而对于任意连续的 $3$ 位二进制数,我们可以把它独立出来,转化成对应的八进制数,而这个八进制数的值和这三位二进制数是相等的。而对于权来说,当前这三位二进制的最左边一位权值就相当于它右边三位二进制的权 $2 *2 *2$(不懂可以看前面, 在 $k$ 进制下,权值每次向左会乘$k$ ),也就是上一位的权 $8$,所以说对于这三位二进制,它是与一位八进制数完全等价的。那么也就可以证明三位二进制等于一位八进制了。

所以就可以十分方便地把二进制转化成八进制:我们直接从小数点开始,向左向右分别以三位为一个组划分,不足就在两端补 $0$ ,然后对于每一组的三位二进制,把它当做一个独立的数处理成八进制就可以,十六进制同理,只不过是四位一组。

对于八进制或者十六进制转换成二进制也是同理,只要把一位八进制拆成 $3$ 位二进制,一位十六进制拆成 $4$ 位二进制就可以了。

以一个例子结尾吧:


我们无法选择过去,但我们可以改变未来。