你打開 Photoshop,顏色面板顯示 #3A7BD5;你在終端機輸入 chmod 644 config.php;你閱讀程式碼,看到 0xFF、0b1010。這些數字背後有同一個概念:進位制(numeral system)。理解進位制不只是數學課的事,它是程式設計師日常工作的底層語言。
一、進位制是什麼?從十進位說起
我們平常用的數字系統是十進位(Decimal,Base-10),每個位置的值是 10 的次方:
1234 = 1×10³ + 2×10² + 3×10¹ + 4×10⁰
= 1000 + 200 + 30 + 4
「逢十進一」是我們從小學到的規則。但電腦的硬體電路只有「有電」和「沒電」兩種狀態,所以電腦用二進位(Binary,Base-2),每個位置只有 0 和 1。
其他進位制(八進位、十六進位)則是從二進位衍生出來的,為了讓人類更容易讀寫電腦資料而存在。
二、二進位(Binary):電腦說的語言
二進位只有 0 和 1,每一個位稱為一個位元(bit),8 個位元組成一個位元組(byte)。
十進位 → 二進位的轉換
方法:持續除以 2,記錄餘數,從下往上讀:
13 ÷ 2 = 6 ... 餘 1
6 ÷ 2 = 3 ... 餘 0
3 ÷ 2 = 1 ... 餘 1
1 ÷ 2 = 0 ... 餘 1
從下往上讀:1101
所以 13(十進位)= 1101(二進位)
驗證:1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1 = 13 ✓
二進位在程式設計中的實際應用
| 場景 | 說明 | 範例 |
|---|---|---|
| 位元運算 | AND、OR、XOR、位移 | flags & 0b0001 |
| 權限旗標 | 用位元表示開關狀態 | READ=0b100, WRITE=0b010 |
| 網路遮罩 | IP 子網路劃分 | 255.255.255.0 = 11111111...00000000 |
| 色彩通道 | 各通道 8 位元(0–255) | R=11111111, G=0, B=0 → 純紅 |
三、八進位(Octal):Linux 檔案權限的秘密
八進位(Base-8)每個位置使用 0–7,最常見的場景是 Unix/Linux 檔案權限。
chmod 數字的由來
Linux 的檔案權限分三組(擁有者、群組、其他),每組三個位元:
| 二進位 | 八進位 | 權限 |
|---|---|---|
| 000 | 0 | ---(無) |
| 001 | 1 | --x(執行) |
| 010 | 2 | -w-(寫入) |
| 011 | 3 | -wx(寫+執行) |
| 100 | 4 | r--(讀取) |
| 101 | 5 | r-x(讀+執行) |
| 110 | 6 | rw-(讀+寫) |
| 111 | 7 | rwx(全部) |
所以 chmod 755 的意思是:
- 擁有者(7):rwx — 可讀、可寫、可執行
- 群組(5):r-x — 可讀、可執行
- 其他人(5):r-x — 可讀、可執行
chmod 644(常見的設定檔權限):擁有者可讀寫(6=rw-),其他人只能讀(4=r--)。
四、十六進位(Hexadecimal):最常出現的進位制
十六進位(Base-16)使用 0–9 和 A–F,一個十六進位字元代表 4 個位元(半個 byte),兩個字元代表一個完整的 byte(0–255)。十六進位是程式設計師日常遇到最多的進位制。
十六進位的常見場合
1. 網頁色碼(Hex Color)
#3A7BD5 分解為:
3A→ 紅色通道(R = 3×16+10 = 58)7B→ 綠色通道(G = 7×16+11 = 123)D5→ 藍色通道(B = 13×16+5 = 213)
所以 #3A7BD5 = rgb(58, 123, 213),一個偏藍的中藍色。
2. 記憶體位址與機器碼
除錯工具(GDB、LLDB、WinDbg)顯示的記憶體位址通常是十六進位:
0x00007ff8`3a7bd510
(gdb) x/16x 0x7ffd5a20
3. 雜湊值與 UUID
MD5: d8e8fca2dc0f896fd7cb4cb0031ba249
SHA256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
UUID: 550e8400-e29b-41d4-a716-446655440000
這些看似隨機的字串,其實都是十六進位的數字序列。每個字元代表 4 個位元,32 個字元的 MD5 = 128 個位元 = 16 bytes。
4. URL 百分比編碼
URL 中的特殊字元用 %XX 編碼,XX 就是該字元 ASCII 值的十六進位表示:
空格 → %20(ASCII 32 = 0x20)
「 → %E3%80%8C(UTF-8 的十六進位)
五、快速心算技巧:十六進位 ↔ 二進位
十六進位和二進位的轉換不需要計算,因為每一個十六進位字元恰好對應 4 個位元:
| 十六進位 | 二進位 | 十六進位 | 二進位 |
|---|---|---|---|
| 0 | 0000 | 8 | 1000 |
| 1 | 0001 | 9 | 1001 |
| 2 | 0010 | A | 1010 |
| 3 | 0011 | B | 1011 |
| 4 | 0100 | C | 1100 |
| 5 | 0101 | D | 1101 |
| 6 | 0110 | E | 1110 |
| 7 | 0111 | F | 1111 |
範例:0xFF = 1111 1111(二進位)= 255(十進位)
範例:0xDEAD = 1101 1110 1010 1101(二進位)= 57005(十進位)
六、Base64:一種特殊的文字編碼
說到進位制,很多人會問:「Base64 是六十四進位嗎?」答案是:不完全是。Base64 是一種編碼方法,不是進位計數系統。它把每 3 bytes(24 bits)的二進位資料,分成 4 組各 6 bits,再映射到 64 個可列印 ASCII 字元(A–Z、a–z、0–9、+、/)。
Base64 的目的是讓二進位資料(圖片、PDF、憑證)能在只支援文字的通道(電子郵件、JSON、HTML)中安全傳輸,並非用於數字計算。
總結
- 二進位:電腦底層語言,位元運算、網路遮罩、色彩通道
- 八進位:主要用在 Unix 檔案權限(chmod 755、644)
- 十六進位:最常見,色碼、記憶體位址、雜湊值、URL 編碼
- 十六進位 ↔ 二進位轉換最簡單:每個 Hex 字元 = 4 個位元
- Base64 是編碼方法,不是進位計數,用途是安全傳輸二進位資料