python-programming
進位制是一種計數方式,簡單來說,就是當我們在數數的時候,每數多少要進位一次的概念。因為人類有十根手指頭,所以人類最熟悉的計數方式是十進制,也就是每數十個數字要進位一次。
但世界上並不是只有十進制這種計數方式。小學的時候大家應該都選過小市長,選小市長在計票的時候我們會寫正字記號:
Figure a.1 歷史慘劇發生前數小時的高雄某開票所,正在使用正字記號計數系統。(2018,已上色)
「正」這個字有五筆劃,每寫下一個「正」就相當於計了 5 ,並且每寫完一個正我們就會開始寫下一個正,因此可以說,正字記號計數系統是一種五進制的系統。
其他還有像是時鐘是一種 60 進制系統、日曆是一種 365 進制系統、音樂的十二平均律是一種 12 進制系統等等,生活中其實充滿了各種不同的進位制。
電腦是利用電子元件的高電位和低電位來進行資料表示與運算的,由於只能區別這兩個狀態,因此你可以把電腦想成是一個只有兩根指頭的人。依照人類有十根指頭因此擅長十進制的邏輯來想,電腦自然而然就是一個擅長二進制的東西了。我們常常說電腦只懂 0101 ,這裡的 0101 指的就是二進制數字的意思。對電腦來說,所有東西都是二進制數字。
雖然電腦只懂二進制數字,但是二進制對於有十根指頭的人類來說,實在是冗長到有點難以閱讀(1011011000010010 到底是多少???),因此人類為了方便,會將二進制數字四個四個一組閱讀,由於四個位數的二進制數字總共有 24 = 16 種組合,因此我們就稱這樣的表達方式叫作十六進制。
由於電腦在表達數字的方法上和人類原本的習慣有很大的差異,因此學習進制轉換是幫助我們了解電腦運作原理很重要的一環。
雖然生活中充滿不同的進位制,但其實他們本來的用意都是在數數用的。在面對一樣數量的東西時,儘管寫出來的數字不一樣,但這些不同的數字背後應該要代表相同的數量意義才對。舉個例子:
Figure a.2 一籃蘋果。
「啊,有 7 個蘋果呢。」
「我看倒是有 111 個蘋果。」電腦說。
「真像一塊塊綠豆糕。」一位外號叫「大食客」的同學緊接著說。
我們不禁哄堂大笑,同樣的一籃蘋果,每個人卻有不同的感覺。我想,這就是雅量吧。
(不是,到底怎麼看成綠豆糕的)
這個籃子裡的蘋果數量,用不同的進位制來表示會寫出不一樣的數字
為什麼會有這樣的差別呢?這就要回到「人們到底怎麼定義 進制的?」這個問題來探討。
Definition a.1 對於一個 進制系統來說,一個位數 (digit) 可以用 種不同數字來表達,分別是 。 如果有一個 位的 進制數字,叫作 ,我們把所有的位數由右到左分別令為 , 那這個數字代表的數值大小以十進制如何表示,就可以用下列算式計算
以大家最熟悉的十進制舉例。在十進制當中,,每個位數只有可能是 0 - 9 十個數字的其中一個。假設有一個 位數的數字 ,那麼:
現在你知道為什麼電腦會覺得上面這個籃子裡有 111 個蘋果了。
利用定義 a.1 ,我們可以將任何進位制的數字都轉換成十進制,以便讓我們了解該數字實際上代表的數值大小是多少。
在 Appendix 1.1 當中,我們有提到人類為了方便閱讀二進制數字,會將二進制數字四個四個一組閱讀,形成十六進制。這樣的操作使得二進制和十六進制要互轉是很容易的,你不必大費周章地把二進制數字轉換成十進制數字,再將該十進制數字轉換過去十六進制數字。
首先,我們要先知道十六進制到底有哪些數字。根據定義 a.1 ,十六進制系統每個位數會有 16 種不同的數字可以用,因為人類原本的計數系統只有十個數字,所以多出來的六個數字只好從別的地方借來用了。這 16 種數字分別是 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F ,其中 A - F 分別代表 10 - 15。
接著,由於二進制數字每一個位數都只會有兩種可能,四位數的二進制數字就會有 24 = 16 種不同數字,剛好也會對應到十進制中的 0 - 15 。因此,十六進制、二進制和十進制數字之間會有一一對應的關係,如下表所示:
有了這個對應表,你現在可以快速的在二進制和十六進制之間自由切換了!