引入
十进制
十进制,就是每到十就进一位,所以十位的 \(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\)。
这下我们就解决了进制转换的问题!