iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
Software Development

三十天內用C++寫出一個小遊戲系列 第 7

Day 7 - 數學是不是會擊垮一個人的信心? 會

簡介

上一篇介紹了如何利用2進位來表示10進位的數字,這次則要再進階的介紹一下4、8、16進位。在下一篇會講解一下這些進位在電腦裡面是怎麼被運用的。


4進位

4進位顧名思義,就是每當數字到4的時候就要進一位。

例如:

【4 進位】

10進位 4進位 可以想成
21 0 111 1 * 16 + 1 * 4 + 1 * 1
64 1 000 64 ( 4的3次方 )
15 0 033 3 * 4 + 3 * 1
81 1 101 1 * 64 + 1 * 16 + 1 * 1

8進位

8 進位其實也就是當數字到 8 的時候就要進位。7 → 8 要進位;63 → 64 要進位;511 → 512要進位,以此類推。

例如:

【8 進位】

10進位 4進位 可以想成
21 025 2 * 8 + 5 * 1 ( 8 ^ 0)
64 100 1 * 64
15 017 1 * 8 + 7 * 1
81 121 1 * 64 + 2 * 8 + 1 * 1

16進位

8 進位其實也就是當數字到 8 的時候就要進位。15 → 16 要進位;255 → 256 要進位,以此類推。

但是要注意的是,在16進位裡面數字會這樣表示:

16進位 : 0 1 2 3 4 5 6 7 8 9 10 A  B  C  D  E

對應到 : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

例如:

【16 進位】

10進位 4進位 可以想成
21 015 1 * 16 + 5 * 1
64 040 4 * 16
15 00E 15 * 1
81 051 5 * 16 + 1 * 1
512 200 2 * 16^2 (256)

可以看到在16 進位中15會被表示成 E 。


為什麼要用4、8、16進位

這是因為在2進位中,如果今天要存入一個很大的數字,就只能用一大串數字來儲存,但是4進位或甚至16進位可以在更少的數列中儲存更多的資訊。

可以舉一個例子:

如果今天要在電腦裡面存入一個數字 9987

我們可以把這個數字拆解成

8192(2^13) + 1024(2^10) + 512(2^9) + 256(2^8) + 2(2^1) + 1(2^0)

如果以二進位來記錄的話會長成這樣:

010 0111 0000 0011

如果把它改成8進位會長怎樣呢?

可以把數字拆成:

2 * 4096(8^4) + 3 * 512(8^3) + 4 * 64(8^2) + 3 * 1(8^0)

所以以8進位表示會變成:

23403

會節省了很多的時間!


10 - 2 - 8 - 16的互換

那今天如果要直接換算一個數字,然後把它換成其他的進位制,總不可能像上面一樣要先因式分解,再一個一個的算吧!

其實有一個方式,可以換算10進位與其他進位


10進位與其他進位

用短除法除想要的數字 例如:

要把(58)10進位 變成2進位

就可以把

58 / 2 = 29 mod 0

29 / 2 = 14 mod 1

14 / 2 = 7 mod 0

7 / 2 = 3 mod 1

3 / 2 = 1 mod 1

1 / 2 = 1 mod 1

就可以把它寫成 : 111010

你看,是不是很輕鬆!


2-8-16進位的互換

如果今天要把2進位換成8或是16進位呢?

這時候只要使出畫線大法就好了。

例如:

2進位:10111010011

要換成8進位的話,就要從最小的開始,每三個畫一條線:

2進位:10 111 010 011

這時候就可以把對應到2進位的值換成8進位的值,就會變成:

8進位:2  7   2   3  

那如果是要換算成16進位的話,就要改成四個畫一條線:

2進位:101 1101 0011

16進位 : 5   D    3    

這樣就完成了!

那如果要換回來,就是把16進位換成每四個一組的2進位:

16進位: A    5    4   

2進位 : 1010 0101 0100 

這樣就可以換回來了!


小結

這些進位制有時候會搞倒我,因為我的數學實在不太行:(

但我還是進我的全力來搞懂他們,另外還有一些補數的部分,其實我還不是很了解,大家有空的話可以看看杰哥的文章,他寫的hen好!


參考資料

  1. https://www.itread01.com/content/1550376565.html
  2. https://www.footmark.info/introduction-to-computer/digital-system-conversion/
  3. https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/HyOUUA8RO (杰哥的文章!)

上一篇
Day 6 - 二進位會不會被禁位?
下一篇
Day 8 - 變數又來了? 變數怎麼叫 a
系列文
三十天內用C++寫出一個小遊戲30

尚未有邦友留言

立即登入留言