0%

进制转换

引入

说起进制,大家应该都不陌生。今天来讲一讲进制转换。

十进制

十进制,就是每到十就进一位,所以十位的 \(1\) 就代表 \(1\) 个十。用数学表示就是:

\[x=x_1\cdot10^0+x_2\cdot10^1+x_3\cdot10^2+\cdots+x_n\cdot10^{n-1}\]

\(x_n\) 代表 \(x\) 的从右往左数第 \(n\) 位)

二进制

二进制,就是每到二就进一位,所以第二位的 \(1\) 就代表 \(1\) 个二。用数学表示就是:

\[x=x_1\cdot2^0+x_2\cdot2^1+x_3\cdot2^2+\cdots+x_n\cdot2^{n-1}\]

我们用 \((x)_n\) 来表示 \(n\) 进制,那么:

十进制二进制
\((0)_{10}\)\((0)_2\)
\((1)_{10}\)\((1)_2\)
\((2)_{10}\)\((10)_2\)
\((3)_{10}\)\((11)_2\)
\((4)_{10}\)\((100)_2\)
\((5)_{10}\)\((101)_2\)

所以二进制里只有 \(0\)\(1\) ,这就是你在电影高级大片中看到的景象。

加法

和普通加法差不多,不过是逢二进一,也就是 \((1)_2+(1)_2=(10)_2\)\((10)_2+(11)_2=(101)_2\)

减法

同样和普通减法差不多,但是这回数字们变穷了,借位只能借到两块钱,也就是 \((100)_2-(10)_2=(10)_2\)\((1000)_2+(11)_2=(101)_2\)

乘法

同样可以用聪明的竖式计算,只不过底下的加法还得是二进制的。

除法

依然是套用十进制的竖式。

蛤蟆

对于乘除 \(2\),有一种很好的方法来计算,那就是直接左移右移,代入十进制来看就是乘以十后左移,除十右移。

十六进制

十六进制,就是每到十六就进一位,所以第二位的 \(1\) 就代表 \(1\) 个十六。用数学表示就是:

\[x=x_1\cdot16^0+x_2\cdot16^1+x_3\cdot16^2+\cdots+x_n\cdot16^{n-1}\]

有人可能问只有一位怎么到十六,聪明的数学家们早已想好了办法!他们用 A 来代替十,用 F 来代替十五!他们真是太聪明了。

那么如果有人在十六进制里给你一个 \((10)_{16}\),你一看,发现第二位是 \(1\),于是你就知道有 \(1\) 个十六,所以\((10)_{16}=(16)_{10}\)

如上,\((20)_{32}=(16)_{10}\)\((1\text{A})_{16}=(26)_{10}\)\((\text{AAAA})_{16}=(43690)_{10}\)。一个有趣的现象是 \((\text{AAAA})_{16}\div(\text{AAA})_{16}=(10)_{16}\)

进制转换

进制转换,我们考虑 a 进制转 b 进制。

因为我们对十进制比较熟悉,所以我们考虑先把 a 进制转换成十进制,然后再转换成 b 进制。这个思路简直无懈可击!

a进制转十进制

我们以十六进制转十进制为例。

这时需要用到一个按权展开,也就是对于 a 进制的每一位,乘上对应为应表示的数值,最终相加即可。

假设我们要转换的十六进制数为 \((91\text{D})_{16}\)

因为 D 表示的是十进制中的 \(13\),所以先转换一下。

然后我们再列出这样一个式子:

\[(91D)_{16}=9\times16^2+1\times16^1+13\times16^0\]

最终得出 \((91D)_{16}=(2333)_{10}\)

十进制转b进制

我们以十进制转二进制举例。

我们需要用到一个短除法,也就是对要转换的数不断除 b,把余数放到结果堆里,把商放到下一行继续除 b。最后把结果堆里的数据逆序输出,即为结果。

假设我们要转换的十进制数为 \(2333\)

\[2333\div2=1666\cdots1\] \[1666\div2=583\cdots0\] \[583\div2=291\cdots1\] \[291\div2=145\cdots1\] \[145\div2=72\cdots1\] \[72\div2=36\cdots0\] \[36\div2=18\cdots0\] \[18\div2=9\cdots0\] \[9\div2=4\cdots1\] \[4\div2=2\cdots0\] \[2\div2=1\cdots0\] \[1\div2=0\cdots1\]

最后结果是就是 \((100100011101)_2\)

综上,\((91D)_{16}=(100100011101)_2\)

这下我们就解决了进制转换的问题!