MIS 腳印

記錄 IT 學習的軌跡

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

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


進位(數字系統)

二進位(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 → 13 12 01 10 → (1 * 23) + (1 * 22) + (0 * 21) + (1 * 20)。

小數 → 乘法

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

次方計算常見問題

  • 0 * 2 = 0,0 * 任何數都等於 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 個位數的二進位表示,將每一個八進位數字都轉成二進位數字。
  • 計算結果,不足 3 個位數則「前面」補 0。
範例 計算公式
7 6 . 2 1 (8) = 111 110 . 010 001 (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 個位數為一組。
  • 「整數」不足 3 個位數則「前面」補 0。
  • 「小數」不足 3 個位數則「後面」補 0。
範例 計算公式
101 001 110 . 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)

十六進位與二進位的轉換

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

十六進位 → 二進位

  • 計算結果,不足 4 個位數則「前面」補 0。
範例 計算公式
5 B D 1 . B (16) = 0101 1011 1101 0001 . 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 個位數為一組。
  • 「整數」不足 4 個位數則「前面」補 0。
  • 「小數」不足 4 個位數則「後面」補 0。
範例 計算公式
1 1101 0011 . 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)

十六進位與八進位的轉換

必須經過 2 次轉換:

  • 八與十六進位都先轉換為『二進位』。
  • 再轉換為八或十六進位。

十六進位 → 八進位

範例 計算公式

C 9 . A (16) = 11001001.101(2)

11 001 001 . 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)

八進位 → 十六進位

範例 計算公式

3 6 . 6 5 (8) = 11110.110101(2)

1 1110 . 1101 01 (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)

參考


“二、八、十與十六進位 (數字系統) 轉換教學” 有 23 則迴響

  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 說:

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

  5. 路人戊 說:

    非常感謝您提供這麼詳盡的文章!
    有個問題請教:
    在文末十六進位轉八進位的部份,從十六進位先轉為二進位那得的結果,是否應為11001001.1010(2)呢?是的話,其後再轉為八進位所得的數字(311.5),也應隨之修改?
    謝謝!

    • SmallJacky 說:

      是 11001001.1010(2) 沒錯,但因為最後的零不會影響最終的運算結果,因此可以直接省略。

  6. 看起來很複雜,抓到訣竅就變有趣了!

  7. 天信 說:

    本來看參考書看不懂,謝謝Jacky寫的淺顯易懂,讓我了解計算過程

  8. Evan 說:

    您好
    其他進位轉換成十進位中,”欲轉換進位數” 應改成 “原本進位數”,才是對的?

  9. 陳德生 說:

    請問可以轉載至我的網站?我會註明來源

  10. pjm1013 說:

    您好,請問如果是像102.124十進位轉二進位也是相同的原理嗎?我一直搞不懂0.124小數那邊是要*2乘幾次……

    • SmallJacky 說:

      原理都是相同的,但有些部份文章未說明到,您的疑問解答如下:
      [針對小數點] 二、八、十六進位 → 十進位:通常會有固定答案。
      [針對小數點] 十進位 → 二、八、十六進位:有時候未必能在有限位數內得到答案,應該會是有限小數或最後變成循環小數(無限循環)。

      像 0.3 就一定會是循環小數。

  11. 張牾鳳 說:

    除完等於零怎換算,例如280算到都整除2進位,八進位16進位,餘數為零怎麼寫快考試啦,之前一直發燒還尋麻疹,好多啦,救人哦,早安

    • SmallJacky 說:

      1. 280 是十進位嗎?如果是的話,二進位 = 100011000、八進位 = 430、十進位 = 118
      2. 有依文章教學自行試算驗證嗎?應該不會有什麼問題,請用心看完。
      3. 如需驗證換算是否正確,可使用 進位換算計算機Dec.Bin.Oct.Hex|計算Pro 或 Windows 系統內建的「小算盤」切換到程式設計人員模式。

      PS:多試算幾次就學的會了,真的不難。

  12. 張牾鳳 說:

    2位數第一層餘八?第三層餘零。八位數第一層餘四第二層餘零不懂。吃藥醫師說還有感冒用程式算對阿不過考試要手算啊?沒有餘1?不懂耶?八位數沒於三啊?都餘零感冒吃要來了

    • SmallJacky 說:

      十進位轉換二進位只會餘 0 or 1,不可能餘 8。
      您本身數學計算可能就有問題了。

      PS:請清楚表達您的問題,2 位數 = 2 進位? 您是十進位 280 轉換成其它進位嗎?

發表迴響