附錄三:進制換算

在表達數字的時候,一般我們最常用的是十進制,但實際上還有其他各式各樣不同的進制,例如在電腦的世界中,最常用的是二進制或十六進制。這裡我們要來簡介一下不同進制的換算方式。

十進制

假設我們有 331 顆彈珠,要用十進制來表示,實際上這邊說的 331 就是十進制,所以答案當然是 331。不過我們還是把這個計數過程演練一次,這樣我們對於其他不同的進制,也容易類推並了解它的換算方法。

現在開始數彈珠,從第 1 顆開始,然後 2, 3, …一直數下去。當數到 10 的時候,因為是 10 進制,所以應該進到第二位,一般我們稱它為「十位」。因為每 10 個都應該進位到十位,所以會進位幾次到十位呢?

331 ÷ 10 = 33 … 1

也就是說,有 33 個十位,而個位部份剩下 1 個,那我們現在知道,個位數應該放 1。

但是十進位的部份,也是每 10 個就該進到下一位,我們稱它為「百位」。那現在有 33 個,會進位幾次到百位呢?

33 ÷ 10 = 3 … 3

也就是說,有 3 個百位,十位部份剩下 3 個,所以十位數應該放 3。

那百位的部份,目前有 3 個,沒有進位的問題,所以百位就放 3。

最後我們得到十進制的表達方式為 331。

注意在計算過程中,我們可以看到一個十位等於十個個位,而一個百位等於十個十位,也等於一百個個位,所以也可以這樣來理解 331:

331 = 3 × 100 + 3 × 10 + 1 × 1 = 3 × 102 + 3 × 101 + 1 × 100

這邊 102, 101, 100 可以看成是百位、十位、個位的權重。

十六進制

現在來討論十六進制。十六進制顧名思義,就是算到第 16 個的時候才進到下一位。但我們一般習慣用 0~9 的阿拉伯數字,也就只有十個符號,還不夠用達表達十六進制。一般的方是就是再借用英文的 A~F 六個字母,這樣總共就有 16 個符號,表達上就沒有問題了。其中 A~F 分別用來表達第 10 個到第 15 個數,那第 16 個就應該進位了。

怎麼用十六進制來表達 331 呢?跟上面十進制的方式一樣,從 1 開始算,每算到 16 個的時候,就進到下一位,那我們估且稱它為第二位好了。會進位幾次到第二位呢?

331 ÷ 16 = 20 … 11

也就是說,有 20 個第二位,剩下 11 個沒進位。那第 11 個也就是符號 B,所以第一位應該是 B。

那第二位的部份有 20 個,也是每 16 個就該進到下一位,估且稱第三位好了,那麼會進位幾次到第三位呢?

20 ÷ 16 = 1 … 4

也就是說,只有 1 個進到第三位,剩下 4 個留在第二位。因為 1 個沒有進位的問題,所以不用再算下去了。

最後我們得到十六進制的表達方式為 14B。

同樣的,因為一個第二位等於 16 個第一位,而一個第三位等於 16 個第二位,也等於 16 × 16 = 256 個第一位,所以也可以這樣來理解十六進位的 14B:

(14B)16 = 1 × 162 + 4 × 161 + 11 × 160 = 1 × 256 + 4 × 16 + 11 × 1 = (331)10

這邊 162, 161, 160 可以看成是第三位、第二位、第一位的權重。

百進制

我們很少聽說有百進制的,不過既然已經了解進制的計算方式,不妨來試看看百進制的情況。因為百進制需要一百個符號,顯然 10 個阿拉伯數字再加上 26 個英文字母都不夠用,如果我們再補上一些稀奇古怪的符號,可能就變得太複雜了。我們乾脆用 X0, X1, …, X99 這 100 個符號來表達就好了,這樣一來,需要再多的符號都沒有問題,而且也很容易看出它們的順序。

同樣的,每次計算到第 100 個的時候,就應該進位,那麼,

331 ÷ 100 = 3 … 31

所以有 31 個留在第一位,有 3 個進到第二位。第 31 個的表達符號應該為 X31,而第 3 個的表達符號為 X3,所以最後得到百進制的表達式為 X3 X31

我們也可以用權重的方式來理解 X3 X31這個數:

(X3 X31)100 = 3 × 100 + 31 × 1 = (331)10

十進制和百進制的換算

331 的十進制就是 331,而百進制則是 X3 X31,這兩個看起來很相似。實際上,我們很容易可以理解,因為百進制要算到 100 才會進位,而 100 對十進制來說,等於是進了二位,所以一個百進制的進位,也就等於二個十進制的進位。或則也可以這樣說,每一個百進制的符號,可以對應到二個十進制的符號。這樣的話,我們要做這兩者的換算就很容易了。

以 331 為例,因為百進制的 X31 等於十進制的 31,而百進制的 X3 等於十進制的 03,所以百進制的 X3 X31 就等於十進制的 0331,或者一般會去掉前面的 0,就寫成 331。反過來,十進制的 331,就等於 0331,也就等於百進制的 X3 X31

再舉其他例子:十進制的 332211 就等於百進制的 X33 X22 X11,而百進制的 X1 X45 X23 就等於十進制的 14523。

從上面的說明可以知道,因為百進制的一個符號,相當於十進制的二個符號,只要掌握彼此的對應關係,要做十進制和百進制的換算,其實是非常容易的。要把百進制換算成十進制,基本上就是直接把每個百進制的符號,改成二個十進制的符號就可以了。反過來,要把十進制換算成百進制,就從個位往左,把每二個符號改成一個百進制的符號就可以了。

十六進制和二進制的換算

了解了十進制和百進制之間的換算方式之後,我們再來看十六進制和二進制的換算,就很容易找到它的訣竅。

二進制是逢 2 進位,那麼第 2 個的話會進一位,第 4 個會進二位,第 8 個會進三位,第 16 個就進四位。但對於十六進制來說,第 16 個才進位一次,所以 1 個十六進制的符號,等於 4 個二進制的符號。兩者的對應關係如下:

有了這個對應表之後,我們要做十六進制和二進制的換算就很容易了,基本上就是把十六進制的 1 個符號,對應成 4 個二進制的符號就好了。例如:

(1AF)16 = (0001 1010 1111)2 或 (1 1010 1111)2
(1010110)2 = (0101 0110)2 = (56)16

八進制

了解十六進制和二進制的換算方法之後,接著看八進制和二進制的換算就很容易了。基本上八進制的一個符號,等於是二進制的三個符號,兩者的對應關係如下:

舉例來說:

(354)8 = (011 101 100)2 或 (11 101 100)2
(1010110)2 = (001 010 110)2 = (126)8

如果要做十六進制和八進制的轉換,我們可以把二進制當作轉換的橋樑,例如:

(354)8 = (011 101 100)2 = (1110 1100)2 = (EC)16

小數的處理

一般的實數可能會帶有小數,我們可以把整數部份和小數部份分開,並利用權重的概念,來計算小數的數字。 舉例說明,要把十進制的 11.375 轉換成二進制,首先可以先處理整數 11:

(11)10 = (1011)2

接著處理小數的部份 0.375。假設轉成二進制之後,其小數位元為 0. A-1 A-2 A-3 …,則:

(0.375)10 = (0. A-1 A-2 A-3 …)2

因為右邊是二進制,每個相隔的數字權重都差兩倍,如果我們把它乘以 2 的話,就等於是往左移一位,所以:

(0.75)10 = (A-1. A-2 A-3 …)2 ==> A-1 = 0

這樣就找出了 A-1,繼續把兩邊同乘以 2:

(1.5)10 = (A-2. A-3 A-4 …)2 ==> A-2 = 1

這次數目大於 1 了,可以先把整數部份去掉:

(0.5)10 = (0. A-3 A-4 …)2 ==> A-2 = 1

接著再把兩邊同乘以 2:

(1.0)10 = (A-3. A-4 …)2 ==> A-3 = 1

去掉整數部份之後,已經剩下 0,所以已經轉換完畢,所以小數:

(0.375)10 = (0.011)2

把整數部份加進去,最後得到:

(11.375)10 = (1011.011)2

注意:轉換成小數的時候,有可能會產生數字循環的狀況,也就是會變成無限個位數。因為一般電腦在儲存小數的時候,只能儲存有限個位數,所以如果存的是浮點數 (實數),有可能會產生一些誤差。