十六進位、二進位、八進位到底差在哪?程式設計師每天在用的進位制完整解析

你打開 Photoshop,顏色面板顯示 #3A7BD5;你在終端機輸入 chmod 644 config.php;你閱讀程式碼,看到 0xFF0b1010。這些數字背後有同一個概念:進位制(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 的檔案權限分三組(擁有者、群組、其他),每組三個位元:

二進位八進位權限
0000---(無)
0011--x(執行)
0102-w-(寫入)
0113-wx(寫+執行)
1004r--(讀取)
1015r-x(讀+執行)
1106rw-(讀+寫)
1117rwx(全部)

所以 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),一個偏藍的中藍色。

色碼轉換:色碼轉換工具支援 HEX、RGB、HSL 互轉,並有即時色塊預覽,適合設計師快速確認色碼對應的實際顏色。

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 的十六進位)
URL 編解碼:URL 編解碼工具可以自動處理百分比編碼轉換,適合處理含中文或特殊符號的網址。

五、快速心算技巧:十六進位 ↔ 二進位

十六進位和二進位的轉換不需要計算,因為每一個十六進位字元恰好對應 4 個位元

十六進位二進位十六進位二進位
0000081000
1000191001
20010A1010
30011B1011
40100C1100
50101D1101
60110E1110
70111F1111

範例: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 是編碼方法,不是進位計數,用途是安全傳輸二進位資料