電腦的世界充滿了進位制的影子:CSS 裡的 #1A2B3C、記憶體位址 0x7FFFFFFF、Base64 編碼、URL 的 %20……這些看似神秘的字串,背後都是同一個概念——進位制(Number Systems)。理解它,你就能讀懂更多底層技術的邏輯。
一、什麼是進位制?
進位制是「用多少個符號來表示數字」的規則。我們日常使用十進位(Base-10),因為有 0–9 共 10 個符號;當數到 9 的下一個,就「進位」變成 10。
同理:
- 二進位(Base-2):只有 0 和 1,數到 1 的下一個就進位,變成 10(讀作「一零」,代表十進位的 2)
- 八進位(Base-8):符號 0–7,數到 7 下一個進位
- 十六進位(Base-16):符號 0–9 加上 A–F(A=10, B=11, …, F=15),數到 F 下一個進位
| 十進位 | 二進位 | 八進位 | 十六進位 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 8 | 1000 | 10 | 8 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
| 255 | 11111111 | 377 | FF |
二、二進位(Base-2)
二進位是電腦硬體的語言。電路只有「通電」與「斷電」兩種狀態,正好對應 1 和 0。每一個 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)
二進位轉十進位
方法:每一位乘以 2 的對應次方,加總。
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1
= 13
三、十六進位(Base-16)
十六進位是程式設計中最常見的進位制,因為它和二進位之間有完美的對應關係:每 4 個位元恰好對應一個十六進位數字。
二進位:1111 1010 1011 1100
十六進位: F A B C → FABC
這讓十六進位成為表達記憶體位址、顏色碼、雜湊值的理想格式——既比二進位短,又和底層二進位有直接的對應。
十進位轉十六進位
方法:反覆除以 16,餘數 10–15 用 A–F 表示。
255 ÷ 16 = 15 餘 15(F) ↑
15 ÷ 16 = 0 餘 15(F) ↑
結果:FF(十進位 255 = 十六進位 FF)
實際案例:CSS 顏色碼
CSS 顏色碼 #FF5733 是三對十六進位數字,分別代表 R(紅)、G(綠)、B(藍):
| 色碼 | 十六進位 | 十進位(0–255) |
|---|---|---|
| 紅(R) | FF | 255 |
| 綠(G) | 57 | 87 |
| 藍(B) | 33 | 51 |
因此 #FF5733 等同於 rgb(255, 87, 51)——一種偏橘紅的顏色。
四、URL 編碼中的十六進位
URL 只允許特定字元,不允許的字元(如空格、中文、特殊符號)必須用百分比編碼(Percent Encoding)表示:將字元的 UTF-8 位元組轉為十六進位,前面加 %。
| 原始字元 | URL 編碼 | 說明 |
|---|---|---|
| 空格 | %20 | 十六進位 20 = 十進位 32(空格的 ASCII 碼) |
| / | %2F | 斜線在路徑之外需編碼 |
| 中 | %E4%B8%AD | UTF-8 編碼為 3 個位元組 |
| @ | %40 | 在某些 URL 部分需編碼 |
五、Base64:另一種常見的編碼方式
Base64 並非進位制,而是一種將二進位資料轉為可列印文字的編碼方式。它把每 3 個 byte(24 bits)分成 4 組 6-bit,每組對應 64 個字元之一(A–Z、a–z、0–9、+、/)。
原始(ASCII):Man
二進位:01001101 01100001 01101110
分組(6-bit):010011 010110 000101 101110
Base64: T W F u → TWFu
Base64 輸出比原始資料大約 33%(每 3 bytes 變 4 字元),但能安全地在只支援文字的管道(如 email、HTML 屬性、JSON)中傳輸二進位資料。
六、進位制在程式設計中的實際應用
記憶體位址
除錯工具和記憶體傾印通常以十六進位顯示位址,例如 0x7FFE1234。前綴 0x(C/C++/Python/JS)、#(CSS)或 0b(二進位)是程式語言標示進位制的常見方式。
位元遮罩(Bitmask)
Unix 檔案權限用八進位表示,如 chmod 755:
7 = 111(二進位)= 讀(4) + 寫(2) + 執行(1)
5 = 101(二進位)= 讀(4) + 執行(1)
5 = 101(二進位)= 讀(4) + 執行(1)
顏色計算
前端工程師常需要在 HEX 與 RGB 之間換算,理解十六進位讓這個過程一目瞭然。色彩轉換、對比度計算等工作也建立在這個基礎上。
雜湊輸出
MD5 輸出 128 bits,以 32 個十六進位字元表示(每個字元 = 4 bits);SHA-256 輸出 256 bits,以 64 個十六進位字元表示。
七、各語言中的進位制表示
| 語言 | 二進位 | 八進位 | 十六進位 |
|---|---|---|---|
| Python | 0b1010 | 0o12 | 0xA |
| JavaScript | 0b1010 | 0o12 | 0xA |
| C / C++ | —(無原生語法) | 012 | 0xA |
| Java | 0b1010 | 012 | 0xA |
| CSS | — | — | #FF5733 |
總結
進位制不是艱深的理論,而是理解許多日常技術的鑰匙:
- 二進位是電腦底層的語言,位元運算的基礎
- 十六進位是程式設計的通用語,顏色碼、記憶體位址、雜湊值都用它表示
- Base64 建立在二進位之上,解決了二進位資料在文字環境中傳輸的問題
- URL 編碼用十六進位標記不允許的字元,讓網址可以包含任意文字
理解這些基礎後,你看到 %E4%B8%AD、#FF5733、TWFu 這些字串,就能立刻讀懂它們代表的意義。