Try   HackMD

Python Programming - Appendix 有的沒的

tags: python-programming

Appendix 1. 進位制與進制轉換

Appendix 1.1 進位制

進位制是一種計數方式,簡單來說,就是當我們在數數的時候,每數多少要進位一次的概念。因為人類有十根手指頭,所以人類最熟悉的計數方式是十進制,也就是每數十個數字要進位一次。

 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, # 一次數十個數字
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, # 數了十下就進位
20, 21, ...

但世界上並不是只有十進制這種計數方式。小學的時候大家應該都選過小市長,選小市長在計票的時候我們會寫正字記號:

Figure a.1 歷史慘劇發生前數小時的高雄某開票所,正在使用正字記號計數系統。(2018,已上色)

「正」這個字有五筆劃,每寫下一個「正」就相當於計了 5 ,並且每寫完一個正我們就會開始寫下一個正,因此可以說,正字記號計數系統是一種五進制的系統。

 0,  1,  2,  3,  4, # 一次數五個數字
10, 11, 12, 13, 14, # 數了五下就進位,可以把前面那個位數想成目前已經數完了幾個 5
20, 21, ...

其他還有像是時鐘是一種 60 進制系統、日曆是一種 365 進制系統、音樂的十二平均律是一種 12 進制系統等等,生活中其實充滿了各種不同的進位制。

電腦是利用電子元件的高電位和低電位來進行資料表示與運算的,由於只能區別這兩個狀態,因此你可以把電腦想成是一個只有兩根指頭的人。依照人類有十根指頭因此擅長十進制的邏輯來想,電腦自然而然就是一個擅長二進制的東西了。我們常常說電腦只懂 0101 ,這裡的 0101 指的就是二進制數字的意思。對電腦來說,所有東西都是二進制數字。

雖然電腦只懂二進制數字,但是二進制對於有十根指頭的人類來說,實在是冗長到有點難以閱讀(1011011000010010 到底是多少???),因此人類為了方便,會將二進制數字四個四個一組閱讀,由於四個位數的二進制數字總共有 24 = 16 種組合,因此我們就稱這樣的表達方式叫作十六進制

由於電腦在表達數字的方法上和人類原本的習慣有很大的差異,因此學習進制轉換是幫助我們了解電腦運作原理很重要的一環。

Appendix 1.2 N 進制轉十進制

雖然生活中充滿不同的進位制,但其實他們本來的用意都是在數數用的。在面對一樣數量的東西時,儘管寫出來的數字不一樣,但這些不同的數字背後應該要代表相同的數量意義才對。舉個例子:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Figure a.2 一籃蘋果。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
請問籃子當中有多少個蘋果呢?

「啊,有 7 個蘋果呢。」
「我看倒是有 111 個蘋果。」電腦說。
「真像一塊塊綠豆糕。」一位外號叫「大食客」的同學緊接著說。
我們不禁哄堂大笑,同樣的一籃蘋果,每個人卻有不同的感覺。我想,這就是雅量吧。

(不是,到底怎麼看成綠豆糕的)

這個籃子裡的蘋果數量,用不同的進位制來表示會寫出不一樣的數字

  • 在十進制裏面,籃子裡有 7 個蘋果
  • 在五進制裏面,籃子裡有 12 個蘋果
  • 在二進制裏面,籃子裡有 111 個蘋果

為什麼會有這樣的差別呢?這就要回到「人們到底怎麼定義

N 進制的?」這個問題來探討。

Definition a.1 對於一個

N 進制系統來說,一個位數 (digit) 可以用
N
種不同數字來表達,分別是
0,1,2,...,N1
。 如果有一個
m
位的
N
進制數字,叫作
X
,我們把所有的位數由右到左分別令為
x0,x1,x2,...,xm1
, 那這個數字代表的數值大小以十進制如何表示,就可以用下列算式計算

XN=xm1×Nm1+...+x2×N2+x1×N1+x0×N0

以大家最熟悉的十進制舉例。在十進制當中,

N=10,每個位數只有可能是 0 - 9 十個數字的其中一個。假設有一個
m=3
位數的數字
123
,那麼:

12310=1×102+2×101+3×100=100+20+3=123

現在你知道為什麼電腦會覺得上面這個籃子裡有 111 個蘋果了。

1112=1×22+1×21+1×20=4+2+1=7

利用定義 a.1 ,我們可以將任何進位制的數字都轉換成十進制,以便讓我們了解該數字實際上代表的數值大小是多少。

Appendix 1.3 二進制與十六進制

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 。因此,十六進制、二進制和十進制數字之間會有一一對應的關係,如下表所示:

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

有了這個對應表,你現在可以快速的在二進制和十六進制之間自由切換了!

0b 1011 0110 0001 0010
=     B    6    1    2
= 0xB612
  
0x9527
=       9    5    2    7
= 0b 1001 0101 0010 0111

Appendix 2. 資料表示法

Appendix 2.1 整數:二補數

Appendix 2.2 浮點數: IEEE 754

Appendix 2.3 字元: ASCII

Appendix 3. 位元運算

Appendix 3.1 邏輯閘

  • 互斥或
  • 位移

Appendix 3.2 位元運算

Appendix 3.3 位元運算的應用

  • 奇偶數判斷
  • x2 /2
  • 大小寫轉換
  • 更多花式技巧請參考 jserv 的講義(?)

Appendix 4. 邏輯等價

Appendix 4.1 且跟或的關係

Appendix 4.2 「存在至少一個」和「所有的」的關係

Appendix 4.3 邏輯等價


<< Lec ?? - ??? | 目錄