什麼是位值系統
在十進位數 4,095 中,4 的值並不是 4,而是 4,000,因為它在千位。每個位置都會把數字乘上 10 的次方(1、10、100、1,000……)。這就是位值系統,而「基數」就是使用的不同數字的個數:十進位是十個。
二進位的原理一樣,只是基數是 2:只有 0 和 1,而且每個位置的值都是前一位的兩倍。十六進位的基數是 16:十六個數字是 0 到 9 加上字母 A 到 F,每個位置的值是前一位的 16 倍。電腦使用二進位,是因為電路只需要分辨兩種狀態(關和開),而十六進位則是把這些位元寫短的一種方式。
| 位置(由右到左) | 二進位的值 | 十六進位的值 |
|---|---|---|
| 第 1 位 | 1 | 1 |
| 第 2 位 | 2 | 16 |
| 第 3 位 | 4 | 256 |
| 第 4 位 | 8 | 4,096 |
| 第 5 位 | 16 | 65,536 |
| 第 6 位 | 32 | 1,048,576 |
| 第 7 位 | 64 | 16,777,216 |
| 第 8 位 | 128 | 268,435,456 |
手算:二進位轉十進位
把每個數字配上它所在位置的值,然後只把有 1 的位置加起來。以 1101 為例:由右到左,各位置的值是 1、2、4 和 8。
- 寫下這個數字,並在下面寫出每個位置的值:1 1 0 1 的下面是 8 4 2 1。
- 看看每個位置上是什麼:8 的位置是 1,4 的位置是 1,2 的位置是 0,1 的位置是 1。
- 忽略是 0 的位置(這裡是 2 的位置)。
- 相加:8 + 4 + 0 + 1 = 13。所以二進位的 1101 就是十進位的 13。
位數更多時也是一樣的:11111111 是 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255,這是 8 位元能容納的最大值。而 10110110 是 128 + 32 + 16 + 4 + 2 = 182。
十進位轉二進位:連續除以 2
把這個數字一次又一次地除以 2,並記下每次除法的餘數(一定是 0 或 1),直到商為 0。把餘數由下往上讀,就是二進位數。以 45 為例:
- 45 ÷ 2 = 22,餘數 1
- 22 ÷ 2 = 11,餘數 0
- 11 ÷ 2 = 5,餘數 1
- 5 ÷ 2 = 2,餘數 1
- 2 ÷ 2 = 1,餘數 0
- 1 ÷ 2 = 0,餘數 1
由下往上讀餘數,得到 101101。要驗算的話,把它加起來:32 + 8 + 4 + 1 = 45。
還有一種很多人偏好的方法:由大到小依序減去 2 的次方。以 200 為例:128 放得下(剩 72),64 放得下(剩 8),32、16 放不下,但 8 放得下(剩 0)。用到的位置是 128、64 和 8,所以 200 = 11001000。
十六進位:十六個數字與一張隨手可查的對照表
因為 10 到 15 沒有對應的數字,所以用字母 A、B、C、D、E 和 F 來表示。一個十六進位數字剛好等於四個位元(一個「半位元組」,nibble),這就是它這麼方便的原因:一個位元組有 8 個位元,只要兩個十六進位數字就能寫出來。
要把十六進位換成十進位,把每個數字乘上它所在位置的 16 的次方,再相加。例如,3F = 3 × 16 + 15 = 63,A3 = 10 × 16 + 3 = 163。
| 十進位 | 二進位(4 位元) | 八進位 | 十六進位 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
為什麼要用十六進位:位元組、顏色與位址
1 個位元組是 8 個位元,範圍從 0 到 255(00000000 到 11111111)。手寫位元既慢又容易出錯;用十六進位的話,同一個位元組只要兩個字元,從 00 到 FF。要把二進位換成十六進位,從右邊起每四個位元分成一組,再把每一組換成對照表中的數字。例如:11010111 分成 1101 和 0111,也就是 D 和 7,所以是 D7。換成十進位是 13 × 16 + 7 = 215。
最廣為人知的例子是網頁顏色。在 #FF8800 中有三個位元組:FF 是紅色(255),88 是綠色(136),00 是藍色(0)。這是一種鮮豔的橘色:紅色全滿、綠色略多於一半、沒有藍色。十六進位也會出現在記憶體位址、錯誤代碼和網路識別碼中。
用 ASCII 把文字換成二進位
電腦把每個字母存成一個數字,再把這個數字存成位元。在 ASCII 表中,A 是 65,8 位元的二進位是 01000001。「Hi」這個詞有兩個字母:H 是 72(01001000),i 是 105(01101001),所以寫成 01001000 01101001。「Hola」則是 72、111、108 和 97,也就是 01001000 01101111 01101100 01100001,用十六進位寫是 48 6F 6C 61。
這個工具使用 UTF-8 編碼:基本的英文字母每個字元佔 1 個 8 位元的位元組,但 ñ、帶重音符號的字母或表情符號會佔好幾個位元組,因此超過 8 位元。例如 ñ 是兩個位元組:11000011 10110001(十六進位為 C3 B1)。
如何用工具完成這一切
「二進位、十進位與十六進位」換算器,可以用來驗算你的手算結果,或在算很長的數字時避免出錯。
- 在對應進位的欄位輸入數字:「十進位(基數 10)」、「二進位(基數 2)」、八進位或「十六進位(基數 16)」。其他三個欄位會自動填好。
- 如果輸入的數字不屬於該進位(例如二進位中出現 2),工具會提醒你。
- 若要轉換文字,請在「文字」欄位輸入,就能看到「二進位(每個字元 8 位元)」以及依位元組顯示的十六進位。你也可以貼上以 8 位元為一組的位元,換回文字。
- 遇到特殊的進位,請使用「任意進位(2 到 36)」:選擇來源進位、目標進位,再輸入數字。
限制:只能換算非負整數(不含小數或正負號),而且不會替你在左邊補 0,所以如果你想要固定 8 位元,需要自己補齊(13 是 00001101)。你輸入的內容都不會離開你的瀏覽器。
常見錯誤
- 餘數讀反了:在連續除法中,第一個餘數是最右邊的數字,不是最左邊的。
- 該補的 0 沒補:13 是 1101,但以一個位元組來看是 00001101。當長度本身就是資料的一部分時(例如顏色或網路遮罩),這一點很重要。
- 複製時把字母 O 當成數字 0,或把十六進位的 B(11)當成 8。十六進位的字母大小寫的值相同,但字母不等於數字。
- 換算時把 0x 前綴或 # 符號留著:它們只是標示這個數是十六進位,貼上之前要先拿掉。
- 以為二進位的 10 是十:它其實是二。同一個「10」,在不同的進位中分別代表 2、10 或 16。
附解答的練習題
先試著自己解每一題,再看答案,最後用工具驗算。
- 把 10110110 換成十進位和十六進位。答案:128 + 32 + 16 + 4 + 2 = 182;每四個一組,1011 0110 = B6。
- 把 200 換成二進位和十六進位。答案:11001000 和 C8(12 × 16 + 8 = 200)。
- 把 7F 換成二進位。答案:7 = 0111,F = 1111,所以是 01111111,換成十進位是 127。
- 把「OK」寫成二進位。答案:O 是 79,K 是 75,也就是 01001111 01001011。
常見問題
怎麼把二進位的 1101 換成十進位?
把有 1 的位置的值加起來:8 + 4 + 1 = 13。從右數起第二位是 0,所以 2 不用加。
255 的二進位和十六進位是多少?
255 的二進位是 11111111,十六進位是 FF。這是 8 位元的一個位元組所能容納的最大值。
十六進位為什麼要用字母?
因為它需要十六個不同的符號,而十進位只提供十個(0 到 9)。所以 A 代表 10、B 代表 11、C 代表 12、D 代表 13、E 代表 14、F 代表 15。
8 個位元可以表示多少個不同的數字?
256 個,從 0 到 255。一般來說,n 個位元可以表示 2 的 n 次方個值。
這個工具能換算負數或小數嗎?
不行,只支援非負整數。文字使用 UTF-8,所以帶重音符號的字母和表情符號會超過 8 位元。