二、八、十與十六進位(數字系統)轉換教學

電腦內部資料都是使用 0 與 1 來儲存的,這種只有 0 與 1 兩種狀態的系統,相當於二進位(數字系統)。人類最常用的為十進位(因為人類具有十根手指而產生的),也是目前最常用的系統。文章會說明目前較常使用的二、八、十與十六進位,及進位間轉換的計算方式教學。

introduction-to-program

進位(數字系統)

二進位(Binary,bin)

  • 基數為 2 的系統,逢 2 進位
  • 數字符號:0, 1

八進位(Octal,oct)

  • 基數 8 的系統,逢 8 進位
  • 數字符號:0, 1, 2, 3, 4, 5, 6, 7

十進位(Decimal,dec)

  • 基數 10 的系統,逢 10 進位
  • 數字符號:0, 1, 2, 3, 4, 5, 6, 7, 8, 9

十六進位(Hexadecimal,hex)

  • 基數 16 的系統,逢 16 進位
  • 數字符號:0, 1, 2, 3, 4, 5, 6, 7, 8, 9 與 10 → A, 11 → B, 12 → C, 13 → D, 14 → E, 15 → F

對照表

十進位 二進位 八進位 十六進位
 0 0000  0 0
 1 0001  1 1
 2 0010  2 2
 3 0011  3 3
 4 0100  4 4
 5 0101  5 5
 6 0110  6 6
 7 0111  7 7
 8 1000 10 8
 9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

有效位

最高有效位(Most Significant Bit,MSB),表示最左邊的位元 → 1010

最低有效位(Least Significant Bit,LSB),表示最右邊的位元 → 1010

進位(數字系統)轉換規則

十進位轉換成其他進位

整數 → 除法

  • 將(十進位『整數』/『欲轉換進位數』),一直除到商數為 0,再依序『由下往上』取出餘數

小數 → 乘法

  • 將(十進位『小數』*『欲轉換進位數』),一直乘到小數為 0,再依序『由上往下』取出整數

其他進位轉換成十進位

以二進位為例:1101.101(2)

整數 → 乘法

  • 以小數點為中心,『由右至左』累加次方,在依(數字 *『欲轉換進位數』次方
  • 1101 → 13120110(1 * 23) + (1 * 22) + (0 * 21) + (1 * 20)

小數 → 乘法

  • 以小數點為中心,『由左至右』累加負次方,在依(數字 *『欲轉換進位數』負次方
  • .101 → 1-10-21-3(1 * 2-1) + (0 * 2-2) + (1 * 2-3)

次方計算常見問題

  • 0 * 2 = 00 * 任何數都等於 0
  • 20 = 1,任何底數的 0 次方都等於 1
  • 22 = 2 * 2,多少次方則依此類推
  • 2-2 = 1/(2 * 2) = 0.25,多少次方則依此類推

進位(數字系統)轉換

二進位與十進位的轉換

十進位 → 二進位
範例 計算公式
12(10) = 1100(2)
12 / 2 = 6 餘數 0 ↑ => 1100(2)
 6 / 2 = 3 餘數 0 |
 3 / 2 = 1 餘數 1 |
 1 / 2 = 0 餘數 1 |
15.625(10) = 1111.101(2) 整數部份
15 / 2 = 7 餘數 1 ↑ => 1111(2)
 7 / 2 = 3 餘數 1 |
 3 / 2 = 1 餘數 1 |
 1 / 2 = 0 餘數 1 |
小數部份
0.625 * 2 = 1.250 取整數 1 |
0.250 * 2 = 0.500 取整數 0 |
0.500 * 2 = 1.000 取整數 1 ↓ => 101(2)
二進位 → 十進位
範例 計算公式
101(2) = 5(10)
(1 * 22) + (0 * 21) + (1 * 20) = 5(10)
1101.101(2) = 13.625(10) 整數部份
(1 * 23) + (1 * 22) + (0 * 21) + (1 * 20) = 13(10)
小數部份
(1 * 2-1) + (0 * 2-2) + (1 * 2-3) = 0.625(10)

八進位與十進位的轉換

十進位 → 八進位
範例 計算公式
395(10) = 613(8)
395 / 8 = 49 餘數 3 ↑ => 613(8)
 49 / 8 =  6 餘數 1 |
  6 / 8 =  0 餘數 6 |
17.25(10) = 21.2(8) 整數部份
 17 / 8 =  2 餘數 1 ↑ => 21(8)
  2 / 8 =  0 餘數 2 |
小數部份
0.25 * 8 = 2.00 取整數 2 ↓ => 0.2(8)
八進位 → 十進位
範例 計算公式
26(8) = 22(10) (2 * 81) + (6 * 80) = 22(10)
162.4(8) = 114.5(10) 整數部份
(1 * 82) + (6 * 81) + (2 * 80) = 114(10)
小數部份
(4 * 8-1) = 0.5(10)

十六進位與十進位的轉換

十進位 → 十六進位
範例 計算公式
2748(10) = ABC(16)
2748 / 16 = 171 餘數 12 ↑ => ABC(16)
 171 / 16 =  10 餘數 11 |
  10 / 16 =   0 餘數 10 |
799.375(10)= 31F.6(16) 整數部份
799 / 16 = 49 餘數 15 ↑ => 31F(16)
 49 / 16 =  3 餘數  1 |
  3 / 16 =  0 餘數  3 |
小數部份
0.375 * 16 = 6.000 ↓ => 0.6(16)
十六進位 → 十進位
範例 計算公式
4EB(16) = 1259(10)
(4 * 162) + (14 * 161) + (11 * 160) = 1259(10)
B2.5(16) = 178.3125(10) 整數部份
(11 * 161) + (2 * 160) = 178(10)
小數部份
(5 * 16-1) = 0.3125(10)

八進位與二進位的轉換

8 = 23,所以八進位可以 3 個位數的二進位表示,將每一個八進位數字都轉成二進位數字。

八進位 → 二進位
範例 計算公式
76.21(8) = 111110.010001(2) 整數第二位數 7
7 / 2 = 3 餘數 1 ↑ => 111(2)
3 / 2 = 1 餘數 1 |
1 / 2 = 0 餘數 1 |
整數第一位數 6
6 / 2 = 3 餘數 0 ↑ => 110(2)
3 / 2 = 1 餘數 1 |
1 / 2 = 0 餘數 1 |
小數第一位數 2
2 / 2 = 1 餘數 0 ↑ => 010(2)
1 / 2 = 0 餘數 1 |
小數第二位數 1
1 / 2 = 0 餘數 1 ↑ => 001(2)
  • 計算結果,不足 3 個位數則「前面」補 0
二進位 → 八進位
範例 計算公式
101001110.01(2) = 516.2(8) 整數左側三位數 101
(1 * 22) + (0 * 21) + (1 * 20) = 5(8)
整數中間三位數 001
(0 * 22) + (0 * 21) + (1 * 20) = 1(8)
整數右側三位數 110
(1 * 22) + (1 * 21) + (0 * 20) = 6(8)
小數三位數 010
(0 * 22) + (1 * 21) + (0 * 20) = 2(8)
  • 以小數點為基準,分向左(整數)右(小數)兩邊,每 3 個位數為一組
  • 「整數」不足 3 個位數則「前面」補 0
  • 「小數」不足 3 個位數則「後面」補 0

十六進位與二進位的轉換

16 = 24,所以十六進位可以 4 個位數的二進位表示,將每一個十六進位數字都轉成二進位數字。

十六進位 → 二進位
範例 計算公式
5BD1.B(16) = 0101101111010001.1011(2) 整數第四位數 5
 5 / 2 = 2 餘數 1 ↑ => 0101(2)
 2 / 2 = 1 餘數 0 |
 1 / 2 = 0 餘數 1 |
整數第三位數 B → 11
11 / 2 = 5 餘數 1 ↑ => 1011(2)
 5 / 2 = 2 餘數 1 |
 2 / 2 = 1 餘數 0 |
 1 / 2 = 0 餘數 1 |
整數第二位數 D → 13
13 / 2 = 6 餘數 1 ↑ => 1101(2)
 6 / 2 = 3 餘數 0 |
 3 / 2 = 1 餘數 1 |
 1 / 2 = 0 餘數 1 |
整數第一位數 1
 1 / 2 = 0 餘數 1 ↑ => 0001(2)
小數第一位數 B → 11
11 / 2 = 5 餘數 1 ↑ => 1011(2)
 5 / 2 = 2 餘數 1 |
 2 / 2 = 1 餘數 0 |
 1 / 2 = 0 餘數 1 |
  • 計算結果,不足 4 個位數則「前面」補 0
二進位 → 十六進位
範例 計算公式
111010011.101(2) = 1D3.A(16) 整數左側四個位數 0001
(1 * 20) = 1(16)
整數中間四個位數 1101
(1 * 23) + (1 * 22) + (0 * 21) + (1 * 20) = 13 → D(16)
整數右側四個位數 0011
(0 * 23) + (0 * 22) + (1 * 21) + (1 * 20) = 3(16)
小數三個位數 1010
(1 * 23) + (0 * 22) + (1 * 21) + (0 * 20) = 10 → A(16)
  • 以小數點為基準,分向左(整數)右(小數)兩邊,4 個位數為一組
  • 「整數」不足 4 個位數則「前面」補 0
  • 「小數」不足 4 個位數則「後面」補 0

十六進位與八進位的轉換

必須經過 2 次轉換:

  1. 八 與 十六進位都先轉換為『二進位』
  2. 再轉換為 八 或 十六進位
十六進位 → 八進位
範例 計算公式
C9.A(16) = 11001001.101(2) 11001001.101(2) = 311.5(8) 先轉換為二進位 整數第二位 C → 12
12 / 2 = 6 餘數 0 ↑ => 1100(2)
 6 / 2 = 3 餘數 0 |
 3 / 2 = 1 餘數 1 |
 1 / 2 = 0 餘數 1 |
整數第一位 9
 9 / 2 = 4 餘數 1 ↑ => 1001(2)
 4 / 2 = 2 餘數 0 |
 2 / 2 = 1 餘數 0 |
 1 / 2 = 0 餘數 1 |
小數第一位 A → 10
10 / 2 = 5 餘數 0 ↑ => 1010(2)
 5 / 2 = 2 餘數 1 |
 2 / 2 = 1 餘數 0 |
 1 / 2 = 0 餘數 1 |
再轉換為八進位,3 個位數為一組 整數左側三位數 011
(0 * 22) + (1 * 21) + (1 * 20) = 3(8)
整數中間三位數 001
(0 * 22) + (0 * 21) + (1 * 20) = 1(8)
整數右側三位數 001
(0 * 22) + (0 * 21) + (1 * 20) = 1(8)
小數三位數 101
(1 * 22) + (0 * 21) + (1 * 20) = 5(8)
八進位 → 十六進位
範例 計算公式
36.65(8) = 11110.110101(2) 11110.110101(2) = 1E.D4(16) 先轉換為二進位 整數第二位 3
3 / 2 = 1 餘數 1 ↑ => 011(2)
1 / 2 = 0 餘數 1 |
整數第一位 6
6 / 2 = 3 餘數 0 ↑ => 110(2)
3 / 2 = 1 餘數 1 |
1 / 2 = 0 餘數 1 |
小數第一位 6
6 / 2 = 3 餘數 0 ↑ => 110(2)
3 / 2 = 1 餘數 1 |
1 / 2 = 0 餘數 1 |
小數第二位 5
5 / 2 = 2 餘數 1 ↑ => 101(2)
2 / 2 = 1 餘數 0 |
1 / 2 = 0 餘數 1 |
再轉換為十六進位,4 個位數為一組 整數左側四位數 0001
(0 * 23) + (0 * 22) + (0 * 21) + (1 * 20) = 1(16)
整數右側四位數 1110
(1 * 23) + (1 * 22) + (1 * 21) + (0 * 20) = 14 → E(16)
小數左側四位數 1101
(1 * 23) + (1 * 22) + (0 * 21) + (1 * 20) = 13 → D(16)
小數右側四位數 0100
(0 * 23) + (1 * 22) + (0 * 21) + (0 * 20) = 4(16)

8 則評論 to “二、八、十與十六進位(數字系統)轉換教學”

  1. 一個路人 說道:

    B2.5是178.3125 不是178.03125 上面你寫錯了 而且有些地方沒把位數補齊

  2. 說道:

    八進位(Octal,oct)
    基數 8 的系統,逢 8 進位
    數字符號:0, 1, 2, 3, 4, 5, 6, 7, 8

    上面的「數字符號」寫錯了,沒有8

  3. 小翔 說道:

    您好,請問能用您網上提供的教學做私人整理與討論應用嗎?

  4. 說道:

    請問一下有小數的十進位換算16進位是如何算的 判定小數點第一位>6就停止嗎

    • SmallJacky 說道:

      您提的這兩個問題,在文章的“進位(數字系統)轉換規則 > 十進位轉換成其他進位 > 小數 → 乘法”都有說明,如仍有不理解之處再詢問。 

發表迴響