搞懂進制轉換:從 2進制到 16進制的完整攻略

搞懂進制轉換:從 2進制到 16進制的完整攻略

前言

進制轉換是計算機科學中最基礎的主題之一,卻也是讓很多人頭痛的地方。雖然考試可以背公式,但理解「為什麼這樣算」才能真正內化這套邏輯。

這篇文章會用清楚的方式帶你搞懂:

  • 什麼是進制
  • 怎麼把任意進制轉成十進制(乘的過程)
  • 怎麼把十進制轉成任意進制(除的過程)
  • 2 進制、8 進制、16 進制之間的捷徑

先搞懂:什麼是進制?

「進制」是一種數字的表示方式,決定了每位數能用到哪些符號。

進制使用的符號範例
2 進制(Binary)0, 10b1010
8 進制(Octal)0 ~ 70o12
10 進制(Decimal)0 ~ 910
16 進制(Hexadecimal)0 ~ 9, A ~ F0xA

十六進制用 A 代表 10、B 代表 11、…、F 代表 15。


轉十進制:從右往左,乘以進制的位數平方

將其他進制轉成十進制,核心概念是:

每位數 × (進制)^(位數位置),從右邊數來第 0 位開始

二進制轉十進制

0b1010(從右往左看)

位置:  3   2   1   0
位數:  1   0   1   0

公式:

0b1010 = 0 × 2^0 + 1 × 2^1 + 0 × 2^2 + 1 × 2^3
       = 0    + 2    + 0    + 8
       = 10

對應的 Python 驗證:

>>> int("1010", 2)
10

八進制轉十進制

0o175(從右往左看)

位置:  2   1   0
位數:  1   7   5

公式:

0o175 = 5 × 8^0 + 7 × 8^1 + 1 × 8^2
       = 5 + 56 + 64
       = 125

十六進制轉十進制

0x3FA(從右往左看)

位置:  2   1   0
位數:  3   F   A
       (15) (10)

公式:

0x3FA = 10 × 16^0 + 15 × 16^1 + 3 × 16^2
       = 10  + 240  + 768
       = 1018

十進制轉其他進制:除法倒取餘數

將十進制轉成其他進制,用的是「除法」:

把目標數字除以目標進制,記錄餘數,持續除到商為 0,最後把餘數由下往上讀。

十進制轉二進制

把 42 轉成二進制:

42 ÷ 2 = 21 ... 餘 0  ↑ 最後讀取的次序
21 ÷ 2 = 10 ... 餘 1  │
10 ÷ 2 =  5 ... 餘 0  │
 5 ÷ 2 =  2 ... 餘 1  │
 2 ÷ 2 =  1 ... 餘 0  │
 1 ÷ 2 =  0 ... 餘 1  ↓ 第一個讀取的次序

從下往上讀:101010

所以 42 = 0b101010

十進制轉十六進制

把 478 轉成十六進制:

478 ÷ 16 = 29 ... 餘 14 (E)
 29 ÷ 16 =  1 ... 餘 13 (D)
  1 ÷ 16 =  0 ... 餘  1

從下往上讀:1DE

所以 478 = 0x1DE

進制之間的捷徑:2、8、16 的特殊關係

2、8、16 都是 2 的次方數,所以他們之間有個非常方便的對應關係:

關係說明
1 位十六進制 = 4 位二進制每 4 個二進位元剛好對應 1 個十六進位元
1 位八進制 = 3 位二進制每 3 個二進位元剛好對應 1 個八進位元

二進制 ↔ 十六進制(直接對應)

0b 1101 1010
    ---- ----
     D    A

所以 0b11011010 = 0xDA

二進制 ↔ 八進制

0b 101 110 010
    --- --- ---
     5   6   2

所以 0b101110010 = 0o562
>>> bin(0xDA)
'0b11011010'
>>> oct(0b101110010)
'0o562'

完整對照表

十進制二進制八進制十六進制
0000000
1000111
91001119
10101012A
15111117F
16100002010
25511111111377FF

結語

進制轉換的核心只有兩個方向:

  • 轉十進制 → 乘:從右往左,每位數乘以 進制^位數
  • 十進制轉其他 → 除:一直除以目標進制,把餘數倒過來讀

而 2、8、16 三者之間因為都是 2 的次方,所以有固定的位元對應關係,可以直接查表轉換,不需要透過十進制。


參考來源