iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

一個月的後端學習之旅系列 第 8

【DAY8】位元轉換學習

  • 分享至 

  • xImage
  •  

對於位元轉換比較不熟悉,特別去學習二進位、八進位、十進位、十六進位之間要如何相互轉換,下面是我統整出的概念跟運算。

電腦內部資料都是使用 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)

有效位

  • 最高有效位 MSB 表示最左邊的位元 → 1010
  • 最低有效位 LSB 表示最右邊的位元 → 1010

對照表

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

轉換規則

十進位轉換成其他進位

  • 整數 用 除法

    十進位 / 欲轉換進位數 ,一直除到商數為 0,再依序 由下往上 取出餘數

  • 小數 用 乘法

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

其他進位轉換成十進位

  • 整數 用 乘法

    以小數點為中心 由右至左 累加次方,在依 數字 * 原本進位數次方

  • 小數 用 乘法

    以小數點為中心 由左至右 累加 次方,在依 數字 * 原本進位數負次方


練習進位轉換

十進位 二進位

十進位 二進位

  • 整數 由下往上
    15(10) = 1111(2)

    15 / 2 = 7 餘數 1 ↑ => 1111(2)
    07 / 2 = 3 餘數 1 |
    03 / 2 = 1 餘數 1 |
    01 / 2 = 0 餘數 1 |

  • 整數 + 餘數
    13.625(10) = 1101.101(2)

    整數

    13 / 2 = 6 餘數 1 ↑ => 1101(2)
    06 / 2 = 3 餘數 0 |
    03 / 2 = 1 餘數 1 |
    01 / 2 = 0 餘數 1 |

    餘數 由上往下 一直乘到小數為 0

    0.625 * 2 = 1.250 取整數 1 |
    0.250 * 2 = 0.500 取整數 0 |
    0.500 * 2 = 1.000 取整數 1 ↓ => 101(2)

二進位 十進位

  • 整數 由右至左
    1101(2) = 15(10)

    (1 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0) = 8 + 4 + 2 + 1 = 15(10)

  • 整數 + 餘數 由左至右 累加 次方
    1101.101(2) = 13.625(10)

    整數

    (1 * 2^3) + (1 * 2^2) + (0 * 2^1) + (1 * 2^0) = 8 + 4 + 0 + 1 = 13(10)

    餘數

    (1 * 2^-1) + (0 * 2^-2) + (1 * 2^-3) = 0.5 + 0 + 0.125 = 0.625(10)

十進位 八進位

十進位 八進位

  • 整數 由下往上
    358(10) = 546(8)

    358 / 8 = 44 餘數 6 ↑ => 546(8)
    044 / 8 = 05 餘數 4 |
    005 / 8 = 00 餘數 5 |

  • 整數 + 餘數
    39.75(10) = 47.6(8)

    整數

    39 / 8 = 4 餘數 7 ↑ => 47(8)
    04 / 8 = 0 餘數 4 |

    餘數 由上往下 一直乘到小數為 0

    0.75 * 8 = 6.00 取整數 6 ↓ => 0.6(8)

八進位 十進位

  • 整數 由右至左
    546(8) = 358(10)

    (5 * 8^2) + (4 * 8^1) + (6 * 8^0) = 320 + 32 + 6 = 358(10)

  • 整數 + 餘數 由左至右 累加 次方
    47.6(8) = 39.75(10)

    整數

    (4 * 8^1) + (7 * 8^0) = 32 + 7 = 39(10)

    餘數

    (6 * 8^-1) = 0.75(10)

十進位 十六進位

十進位 十六進位

  • 整數 由下往上
    1579(10) = 62B(16)

    1579 / 16 = 98 餘數 11 ↑ => 62B(16)
    0098 / 16 = 06 餘數 02 |
    0006 / 16 = 00 餘數 06 |

  • 整數 + 餘數
    339.625(10) = 153.A(16)

    整數

    339 / 16 = 21 餘數 3 ↑ => 153(16)
    021 / 16 = 01 餘數 5 |
    001 / 16 = 00 餘數 1 |

    餘數 由上往下 一直乘到小數為 0

    0.625 * 16 = 10.0 取整數 10 ↓ => 0.A(16)

十六進位 十進位

  • 整數 由右至左
    62B(16) = 1579(10)

    (6 * 16^2) + (2 * 16^1) + (11 * 16^0) = 1536 + 32 + 11 = 1579(10)

  • 整數 + 餘數 由左至右 累加 次方
    153.A(16) = 339.625(10)

    整數

    (1 * 16^2) + (5 * 16^1) + (3 * 16^0) = 256 + 80 + 3 = 339(10)

    餘數

    (10 * 16^-1) = 0.625(10)

二進位 八進位

二進位 八進位

  • 以小數點為基準,分向左 整數 右 小數 兩邊,每 3 個位數為一組
  • 整數不足 3 個位數則前面補 0
  • 小數不足 3 個位數則後面補 0

10100110.01(2) = 246.2(8)
整數

0 10

(0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 0 + 2 + 0 = 2(8)

100

(1 * 2^2) + (0 * 2^1) + (0 * 2^0) = 4 + 0 + 0 = 4(8)

110

(1 * 2^2) + (1 * 2^1) + (0 * 2^0) = 4 + 2 + 0 = 6(8)

小數

01 0

(0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 0 + 2 + 0 = 2(8)

八進位 二進位

  • 計算結果不足 3 個位數則前面補 0

246.2(8) = 10100110.01(2)

整數

2

2 / 2 = 1 餘數 0 ↑ => 010(2)
1 / 2 = 0 餘數 1 |

4

4 / 2 = 2 餘數 0 ↑ => 100(2)
2 / 2 = 1 餘數 0 |
1 / 2 = 0 餘數 1 |

6

6 / 2 = 3 餘數 0 ↑ => 110(2)
3 / 2 = 1 餘數 1 |
1 / 2 = 0 餘數 1 |

小數

2

2 / 2 = 1 餘數 0 ↑ => 0.010(2)
1 / 2 = 0 餘數 1 |

二進位 十六進位

二進位 十六進位

  • 以小數點為基準,分向左 整數 右 小數 兩邊,每 4 個位數為一組
  • 整數不足 4 個位數則前面補 0
  • 小數不足 4 個位數則後面補 0

11001001.101(2) = C9.A(16)
整數

1100

(1 * 2^3) + (1 * 2^2) + (0 * 2^1) + (0 * 2^0) = 8 + 4 + 0 + 0 = 12 = C(8)

1001

(1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (1 * 2^0) = 8 + 0 + 0 + 1 = 9(8)

小數

101 0

(1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 8 + 0 + 2 + 0 = 10 = A(8)

十六進位 二進位

  • 計算結果不足 4 個位數則前面補 0

C9.A(16) = 11001001.101(2)

整數

C

12 / 2 = 6 餘數 0 ↑ => 1100(2)
06 / 2 = 3 餘數 0 |
03 / 2 = 1 餘數 1 |
01 / 2 = 0 餘數 1 |

9

9 / 2 = 4 餘數 1 ↑ => 1001(2)
4 / 2 = 2 餘數 0 |
2 / 2 = 1 餘數 0 |
1 / 2 = 0 餘數 1 |

小數

A

10 / 2 = 5 餘數 0 ↑ => 0.1010 (2)
05 / 2 = 2 餘數 1 |
02 / 2 = 1 餘數 0 |
01 / 2 = 0 餘數 1 |

八進位 十六進位

必須經過 2 次轉換:

  1. 先轉換為二進位
  2. 再轉換為八或十六進位

八進位 十六進位

246.2(8) = C9.A(16)

246.2(8) 先轉換為二進位

-> 10100110.01(2)

-> 再轉換為十六進位 C9.A(16)

整數

1100

(1 * 2^3) + (1 * 2^2) + (0 * 2^1) + (0 * 2^0) = 8 + 4 + 0 + 0 = 12 = C(8)

1001

(1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (1 * 2^0) = 8 + 0 + 0 + 1 = 9(8)

小數

101 0

(1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 8 + 0 + 2 + 0 = 10 = A(8)

十六進位 八進位

C9.A(16) = 246.2(8)

C9.A(16) 先轉換為二進位

-> 11001001.101(2)

-> 再轉換為八進位 246.2(8)

整數

0 10

(0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 0 + 2 + 0 = 2(8)

100

(1 * 2^2) + (0 * 2^1) + (0 * 2^0) = 4 + 0 + 0 = 4(8)

110

(1 * 2^2) + (1 * 2^1) + (0 * 2^0) = 4 + 2 + 0 = 6(8)

小數

01 0

(0 * 2^2) + (1 * 2^1) + (0 * 2^0) = 0 + 2 + 0 = 2(8)

參考資料

binary to decimal

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

下一篇文章會把線上課程的Java Script Basics 1 結束。


上一篇
【DAY7】位元運算子
下一篇
【DAY9】if statement、Truthy and Falsy、補充
系列文
一個月的後端學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言