我們用十進位(base 10)數數,因為有十根手指;電腦用二進位(base 2),因為一條線不是通就是斷;程式設計師愛用十六進位(base 16),因為它是「寫二進位」的精簡好讀寫法。一旦你寫底層的東西,進位互轉就是每天在做的事——而且沒你想的難。
「進位(base)」到底是什麼
進位就是「每一位可以有幾種符號、每個位置值多少」:
- 十進位(10):數字 0–9。位值 1、10、100、1000⋯
- 二進位(2):數字 0–1。位值 1、2、4、8、16⋯
- 八進位(8):數字 0–7。位值 1、8、64⋯
- 十六進位(16):0–9 再加 a–f(a=10 ⋯ f=15)。位值 1、16、256⋯
所以二進位 1010 = 8 + 0 + 2 + 0 = 十進位的 10;十六進位 ff = 15×16 + 15 = 255。
為什麼用十六進位,不直接用二進位?
二進位正確但難讀——11111111 vs ff。因為 16 是 2⁴,每一個十六進位數字剛好對應四個二進位數字,所以十六進位就是二進位的無損簡寫。這就是為什麼顏色(#3388cc)、記憶體位址(0x7ffe)、Unicode 碼點(U+1F600)都用十六進位寫。
唯一的坑:同樣的數字,在不同進位是不同的數
10 在十進位是十、二進位是二、八進位是八、十六進位是十六。一串數字在你知道它是哪個進位之前毫無意義。多數轉換錯誤都出在這——把 100 當成一百,其實它是二進位的四。
文字也只是位元組
「文字轉二進位」之所以成立,是因為每個字元都以位元組(透過 UTF-8)儲存,而每個位元組是 8 個位元。字母 A 是位元組 65 = 二進位 01000001 = 十六進位 41。emoji 和非拉丁字元佔好幾個位元組,但道理一樣。
在瀏覽器本機即時轉換
進位轉換器把四種進位連動:在任一欄輸入,其他即時更新。它用 BigInt,再大的數也精準;還能用 UTF-8 把文字轉成二進位或 Hex(也能還原)。
相關工具
快速對照表
下表每一列都是同一個數字的四種進位寫法,放手邊很好用:
| 十進位 | 二進位 | 十六進位 | 八進位 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 8 | 1000 | 8 | 10 |
| 10 | 1010 | A | 12 |
| 15 | 1111 | F | 17 |
| 16 | 10000 | 10 | 20 |
| 64 | 1000000 | 40 | 100 |
| 100 | 1100100 | 64 | 144 |
| 128 | 10000000 | 80 | 200 |
| 255 | 11111111 | FF | 377 |
| 256 | 100000000 | 100 | 400 |
| 1024 | 10000000000 | 400 | 2000 |
最值得背起來的一列是 255 = 0xFF = 0b11111111——這是單一位元組(8 個位元)能裝下的最大值。
手動換算
- 十進位 → 二進位: 反覆除以 2,由下往上讀餘數。
13→ 6 餘 1、3 餘 0、1 餘 1、0 餘 1 →1101。 - 二進位 → 十進位: 把各位值相加。
1101= 8 + 4 + 0 + 1 =13。 - 二進位 ↔ 十六進位: 從右邊起,每四個位元分成一組。
11111111→1111 1111→F F→FF。 - 十六進位 → 十進位: 每一位乘上對應的 16 次方。
0x2A= 2×16 + 10 =42。
那些前綴是什麼意思
正因為同樣的數字在不同進位是不同的數,程式碼會用前綴標明進位:0x 表示十六進位(0xFF)、0b 表示二進位(0b1010)、0o(或 C 語言裡開頭一個 0)表示八進位(0o17)。沒有前綴就是十進位。要是你不想手動算這些,CSS 色彩格式實用指南示範了同樣的十六進位在網頁顏色裡怎麼運作。