整数的进制转换
十进制向\(k\)进制转换
为了考虑\(k\)进制的本质,我们先来思考这样一个问题:
当我们有一大堆苹果时,我们如何数出它们的数量?
我们当然可以一个一个数,每数一个就发明一个数字记下来。这样的话,当我们有几百个苹果的时候,可能相对于数苹果,我们花在发明新的计数符号上的时间更多。为了避免这种情况,我们可以将苹果分组。比如每当数到10个苹果,我们就找一个袋子将其装起来。而当装苹果的袋子攒够10个,我们就找一个箱子将其装起来。
这样,我们只需要发明0~9这10个计数符号(也就是数字),而每当超过9就向前进1位,并重新计数。这就是进制的本质。
因此,当我们将一个数从十进制向\(k\)进制转换时,我们需要打破之前“装苹果的袋子和箱子”,并重新数数,每当数到\(k\)个就用袋子装起来。这也就是说,在进行进制转换时,我们需要将十进制的数除以\(k\)。第一次除法得到的是装袋剩下的苹果数和苹果袋数,也就是\(k\)进制的“个位数”和暂时的“十位数”(这里只是借用了“十位数”的名字,“暂时”指的是真正的“十位数”应当为装箱后剩下的苹果数,也就是再除一次\(k\)得到的余数)。接着,第二次对“十位数”的除法能得到真正的“十位数”和暂时的百位数。就这样一直做除法,直到商为0。
下面是一个例子
例:将123转换为2进制
解:123/2=61......1(“个位”)
61/2=30......1(“十位”)
30/2=15......0(“百位”)
15/2=7......1
7/2=3......1
3/2=1......1
1/2=0......1
这样,最下方的余数为最左边的数,而最上面的余数为最右边的数。由此我们可以得到 \[ (123)_{10} = (1111011)_{2} \]
\(k\)进制转换十进制
类似地,我们也可以用\(k\)进制的数除以\(k\)进制的10,从而得到对应的十进制数。比如下面这个例子
例:将\((1111011)_{2}\)转换为十进制
解:由于\((10)_{10}=(1010)_{2}\),因此1111011/1010=1100...11(均为二进制数)
1100/1010=1...10
1/1010=0...1
由此可以得到\((1111011)_{2}=(01\ 10\ 11)_{10}\),将\((01)_{2}\)、\((10)_{2}\)、\((11)_{2}\)分别转换为1、2、3后即为\((123)_{10}\)。
但我们马上会发现一个困难的事情,那就是我们很难进行\(k\)进制除法。相比于此,我们有一种很简单的方法。由于\(k\)进制的第\(n\)位表示\(k^{n-1}\)的个数(比如十进制的第二位表示10的个数),因此\(k\)进制数\((a_{n}...a_{2}a_{1})_{k} = \sum\limits_{i = i}^{n}a_{i}k^{i - 1}\)
小数的进制转换
十进制向\(k\)进制转换
要思考这个问题,首先我们需要明确\(k\)进制的小数含义。例如,在三进制中,\((0.1)_{3}\)与十进制中的\((1/3)_{10}\)相等。
同时,在十进制中,小数的第一位“十分位”表示这个数是在十分之几之间。比如0.56中的5表示这个数大于\(\dfrac{5}{10}\),但小于\(\dfrac{6}{10}\)。
因此,如果我们想要把十进制小数转换为\(k\)进制小数,就需要思考这个十进制小数在\(k\)进制小数的哪个区间。下面我们以0.25转换为三进制为例,探究转换方法。
例:将\((0.25)_{10}\)转换为三进制
解:首先,\(0.25\)小于\(\dfrac{1}{3}\),因此可以得到\((0.25)_{10} = (0.0...)_{3}\)
然后,由于\(0.25 \in [\dfrac{2}{9}, \dfrac{3}{9}]\),因此\((0.25)_{10} = (0.02...)_{3}\)
通过这种方法,我们可以得到\((0.25)_{10} = (0.020202...)_{3}\)
实际上,上面的步骤就是在一步步寻找十进制数0.25在\([0, 1]\)上由\(k\)等分点、\(k^{2}\)等分点...\(k^{n}\)等分点分割成的哪一部分。因此,我们可以考虑一种在此基础上的简便方法。
在求三进制小数“十分位”时,我们可以选择将十进制数乘三。这实际上就是将原本长为\(\dfrac{1}{3}\)的间隔映射到长度为\(1\)的间隔。如果\(0.25\)原本属于\([0, \dfrac{1}{3}]\)这个间隔,那么其在乘3放大后应当属于\([0, 1]\)这个间隔。因此,在乘3后,十进制个位数即为三进制的“十分位”。
对于第一次乘3后得到的小数的小数部分,我们也可以用相似的步骤接着乘3,然后取整数部分作为三进制“十分位”。这是因为要得到三进制“十分位”,需要考察这个十进制数位于九等分点形成的哪个区间。在第一次乘3后,九等分点形成的间隔变为了长为\(\dfrac{1}{3}\)的间隔,因此我们可以接着构造类似的映射,将长为\(\dfrac{1}{3}\)的间隔映射为长为\(1\)的映射。
用这个新的方法,我们可以重新求出\((0.25)_{10}\)对应的三进制数
例:将\((0.25)_{10}\)转化为三进制数
解:0.25*3=0.75
0.75*3=2.25
0.25*3=0.75
0.75*3=2.25
由此不难看出\((0.25)_{10} = (0.020202...)_{3}\)