跳到主要內容

← 返回部落格

二進位、十進位、十六進位是什麼?進位互轉完整解說

我們用十進位(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(也能還原)。

相關工具

快速對照表

下表每一列都是同一個數字的四種進位寫法,放手邊很好用:

十進位二進位十六進位八進位
0000
81000810
101010A12
151111F17
16100001020
64100000040100
100110010064144
1281000000080200
25511111111FF377
256100000000100400
1024100000000004002000

最值得背起來的一列是 255 = 0xFF = 0b11111111——這是單一位元組(8 個位元)能裝下的最大值。

手動換算

  • 十進位 → 二進位: 反覆除以 2,由下往上讀餘數。13 → 6 餘 1、3 餘 0、1 餘 1、0 餘 11101
  • 二進位 → 十進位: 把各位值相加。1101 = 8 + 4 + 0 + 1 = 13
  • 二進位 ↔ 十六進位: 從右邊起,每四個位元分成一組。111111111111 1111F FFF
  • 十六進位 → 十進位: 每一位乘上對應的 16 次方。0x2A = 2×16 + 10 = 42

那些前綴是什麼意思

正因為同樣的數字在不同進位是不同的數,程式碼會用前綴標明進位:0x 表示十六進位(0xFF)、0b 表示二進位(0b1010)、0o(或 C 語言裡開頭一個 0)表示八進位(0o17)。沒有前綴就是十進位。要是你不想手動算這些,CSS 色彩格式實用指南示範了同樣的十六進位在網頁顏色裡怎麼運作。