Foundations of Computer Science Chapter 2 數目系統 計算機概論 第二版 Foundations of Computer Science Chapter 2 數目系統
2.1 簡介 數目系統(number system)(或數字系統)定義一個數字如何使用不同符號來表示。 2.1 簡介 數目系統(number system)(或數字系統)定義一個數字如何使用不同符號來表示。 在過去已經有好幾個數目系統被使用,而且可被分為兩類:位置和非位置系統。我們主要目標是去討論各種位置數目系統,但是也會舉出一些非位置系統的例子。 p.18
2.2 位置數目系統 在位置數目系統(positional number system),符號在數字所擺放的位置決定了它表示的值。 2.2 位置數目系統 在位置數目系統(positional number system),符號在數字所擺放的位置決定了它表示的值。 ± (Sk−1… S2 S1 S0. S−1 S−2 … S−l )b 其值為: n = ± Sk−1 × bk−1 + …+ S1 × b1 + S0 × b0 + S−1 × b−1 + S−2 × b−2 + … + S−l × b−l 其中 S 是符號的集合,b 是基底(base)〔或底(radix)〕,其數 量等同集合 S 的符號數量,而 Si 是一個在位置 i 的符號。 p.18
電腦以不同的方式儲存正數和負數。在十進位系統裡,一個數字的表示如下: ± (Sk−1… S2S1S0 . S−1S−2… S−l )10 十進位系統的整數(integer)表示成 ± Sk–1 ... S1 S0。其值的計 算方式如下: N = ± Sk−1 × 10k−1 + Sk−2 × 10k−2 + … + S2 × 102 + S1 × 101 + S0 × 100 其中 Si 是一個數字,基底 b = 10,而 k 是數字的數量。 另一個在數目系統表示整數的方法是使用位值(place value), 是以 10 的次方(100, 101, ⋯, 10k–1)來表示十進位數字。 p.19
圖 2.1 在十進位系統中,一個整數的位值 p.19
範例 2.1 下面是以位值表示在十進位系統的整數 +224。 注意,數字 2 在位置 1 的值是 20,但一樣的數字在位置 2 的值是 200。還有一點也要注意,我們通常捨棄正號,但它只是被隱藏。 p.19
範例 2.2 下面是以位值表示在十進位系統的整數 –7508。我們使用 1, 10, 100 和 1000 來取代 10 的次方。 p.20
十進位系統的實數(real)表示為 ±Sk–1 ... S1S0.S–1...S–l。其值的計算方式如下: 整數部分 小數部分 R = ± Sk−1 × 10k−1 + … + S1 × 101 + S0 × 100 + S−1 × 10−1 + … + S−l × 10−l 其中 Si 是一個數字,基底 b = 10,k 是整數部分的位數,而 l 是小數部分的位數。 p.20
範例 2.3 下面是以位值來表示一個實數 +24.13。 p.20
在二進位系統裡,可以這樣表示一個整數 ±(Sk–1…S1S0)2,其值計算如下: N = ± Sk−1 × 2k−1 + Sk–2× 2k–2 + … + S2 × 22 + S1 × 21 + S0 × 20 其中 Si 是一個數字,基底 b = 2,而 k 是位元的數量。另一個 表示二進位數的方法是使用位值(20, 21, ⋯2k–1)。 p.20
圖 2.2 在二進位系統中,一個整數的位值 p.21
範例 2.4 下面是一個等於十進位數 25 的二進位數 (11001)2。下標的 2 是表 示基底為 2。 注意,這相當於十進位數 N = 16 + 8 + 0 + 0 + 1 = 25。 p.21
其中 Si 是一個位元,基底 b = 2,k 是左邊的位元數量,而 l 是小數點右邊的位元數量。 二進位系統的實數其值的計算方式如下: 其中 Si 是一個位元,基底 b = 2,k 是左邊的位元數量,而 l 是小數點右邊的位元數量。 p.21
範例 2.5 下面是一個等於十進位數 5.75 的二進位數 (101.11)2。 注意,這個值在十進位數是 R = 4 + 0 + 1 + 0.5 + 0.25 = 5.75。 p.22
N = ± Sk−1 × 16k−1 + Sk–2× 16k–2 + … + S2 × 162 + S1 × 161 + S0 × 160 十六進位系統 十六進位系統(hexadecimal system)的基底 b = 16,而且使用十六個符號來表示一個數字,符號的集合 S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}。這個系統的符號通常稱作十六進位數字(hexadecimal digits)。 此系統的一個整數之值計算方式如下: N = ± Sk−1 × 16k−1 + Sk–2× 16k–2 + … + S2 × 162 + S1 × 161 + S0 × 160 其中 Si 是一個數字,基底 b = 16,而 k 是數字的數量。 p.22
圖 2.3 在十六進位系統中,一個整數的位值 p.23
範例 2.6 下面是一個等於十進位數字 686 的十六進位數字 (2AE)16。 p.23
N = ± Sk−1 × 8k−1 + Sk–2× 8k–2 + … + S2 × 82 + S1 × 81 + S0× 80 八進位系統 第二個被設計來顯示在電腦外部等同於二進位系統的系統,稱作八進位系統(octal system)。其基底 b = 8 而且使用八個符號來表示一個數字。符號的集合 S = {0, 1, 2, 3, 4, 5, 6, 7}。這個系統的符號通常稱為八進位數字(octal digits)。 此系統的一個整數之值的計算方式如下: N = ± Sk−1 × 8k−1 + Sk–2× 8k–2 + … + S2 × 82 + S1 × 81 + S0× 80 其中 Si 是一個數字,基底 b = 8,而 k 是數字的數量。 p.23
圖 2.4 在八進位系統中,一個整數的位值 p.24
範例 2.7 下面是一個等於十進位數 686 的八進位數 (1256)8。 注意,這個值在十進位數是 N = 512 + 128 + 40 + 6 = 686。 p.24
表 2.1 四個位置數目系統的結論 p.24
表 2.2 在四種系統中數字的比較 p.25
把來源系統的每個數字乘上它的位值並再加上相乘結果即可得到十進位系統的數字。 任何基底轉換成十進位 把來源系統的每個數字乘上它的位值並再加上相乘結果即可得到十進位系統的數字。 整數 小數 圖 2.5 其他基底轉換成十進位 p.25
範例 2.8 下面顯示如何把二進位數轉換成十進位數:(110.11)2 = 6.75。 p.26
範例 2.9 下面顯示如何把十六進位數 (1A.23)16 轉換成十進位數。 注意,十進位結果並不確準,因為 3 × 16–2 = 0.01171875。我們取 四捨五入成三個位數 (0.012),換句話說,(1A.23)16 ≈ 26.137。當我 們把十進位數轉換成十六進位時,需要明確指出允許小數點右邊 有多少數字。 p.26
範例 2.10 下面顯示如何轉換 (23.17)8 成十進位數。 這個意思是指在十進位裡 (23.17)8 ≈ 19.234。我們再一次取四捨五 入 7 × 8–2 = 0.109375。 p.26
將十進位數字轉成任何基底 整數部分可以使用重複除法的方式來轉換。 使用重複作乘法的方式可以轉換小數部分。 p.26
圖 2.6 將十進位數字之整數部分轉換為其他基底 p.27
圖 2.7 將十進位數字之整數部分轉換為其他基底 p.27
範例 2.11 下面顯示如何把十進位數字 35 轉換成二進位數字。一開始數字是 十進位,我們只要除以 2 得到商和餘數就往左移。轉換的結果為 35 = (100011)2。 p.27
範例 2.12 下面顯示如何把十進位數字 126 轉換成八進位系統的等值。我們 只要除以 8 得到商和餘數就往左移。轉換的結果為 126 = (176)8。 p.28
範例 2.13 下面顯示如何把十進位數字 126 轉換成十六進位系統的等值。只 要除以 16 得到商和餘數就往左移。轉換的結果為 126 = (7E)16。 p.28
範例 2.14 轉換十進位數字 0.625 為二進位。 解答 因為數字 0.625 沒有整數部分,本例顯示了如何計算出小數部分。 最後的結果是 (0.101)2。 p.28
圖 2.8 轉換十進位數字之小數部分為其他基底 p.29
圖 2.9 轉換十進位數字之小數部分為其他基底 p.29
範例 2.15 下面顯示如何把 0.634 轉換成八進位,最多使用四個位數。計算的 結果為 0.634 = (0.5044)8。注意,我們是乘以 8(八進位)。 p.29
範例 2.16 下面顯示如何把十進位 178.6 轉換成十六進位,小數點右邊只使用 一個位數。計算的結果為 178.6 = (B2.9)16。注意,我們是除以或乘 以 16(十六進位)。 p.29
範例 2.17 另一種轉換很小的十進位數字(通常小於 256)為二進位數字的方 案是把數字打散,即將數字分割成二進位的位值和,表示如下: 使用這個表,可以轉換 165 為二進位 (10100101)2,表示如下: p.30
範例 2.18 一個相似的方法可以被用來轉換十進位分數為二進位,當分母是 二的次方: 使用這個表,可以轉換 27/64 為二進位 (0.011011)2,表示如下: 調整這些分數並對應成等同於十進位的值。 p.30
在一個基底為 b 的位置數目系統裡,我們使用 log 關係 數字的位數 在一個基底為 b 的位置數目系統裡,我們使用 log 關係 總能找出一個整數的位數有幾個,其中 的意思是一個大於或等於 x 的最小整數(也稱作 x 的天花板),而 N 是整數的十進位值。 二進位與十六進位相互轉換 在二進位裡四個位元是十六進位的一個數字。 p.31
圖 2.10 二進位轉十六進位與十六進位轉二進位 p.31
範例 2.19 顯示二進位數 (10011100010)2 在十六進位的等值。 解答 我們首先把二進位數以四個位元為一組作整理:100 1110 0010, 要注意最左邊的一組可以是一到四個位元。然後使用表 2.2 來轉換 數字為十六進位:(4E2)16。 p.31
範例 2.20 (24C)16 在二進位的等值是什麼? 解答 每個十六進位數字轉換為四個位元一組:2 → 0010、4 → 0100、 p.31
二進位與八進位相互轉換 在二進位裡三個位元是八進位的一個數字。 圖 2.11 二進位轉八進位與八進位轉二進位 p.32
範例 2.21 顯示二進位數 (101110010)2 在八進位的等值。 解答 每三個位元為一組轉換為八進位的一個數字。表 2.2 顯示了每三位 元為一組的等值。其結果為 (562)8。 p.32
範例 2.22 (24)8 在二進位的等值是什麼? 解答 寫下每個八進位數字的二位元樣式即可得到 (010100)2。 p.32
圖 2.12 八進位轉十六進位與十六進位轉八進位 p.32
從八進位轉換為十六進位,我們首先把數字從八進位系統轉為二進位。然後把位元整理成四個位元為一組,再找出在十六進位的等值。 八進位與十六進位的相互轉換 從八進位轉換為十六進位,我們首先把數字從八進位系統轉為二進位。然後把位元整理成四個位元為一組,再找出在十六進位的等值。 從十六進位轉換為八進位,我們首先把數字從十六進位系統轉為二進位。然後把位元整理成三個位元為一組,再找出在八進位的等值。 p.33
數字的位數 假設我們在基底 b1 的系統使用 k 個數字,在來源系統我們能表示的最大數字是 b1k - 1,在目的系統能表示的最大數字是b2x - 1。因此,b2x - 1 ≥ b1k - 1。這意味著 b2x ≥ b1k,即: p.33
範例 2.23 要儲存最多六個數字的十進位整數至少需要幾個二進位數字。 解答 k = 6,b1 = 10,b2 = 2。 而 x = = 20。六個數字 的十進位數最大值是 999,999,而二十個位元的二進位數最大值是 1,048,575。要注意,十九個位元所能表示的最大值是 524,287,這 比 999,999 還小。很明顯我們需要的是二十個位元。 p.33
2.3 非位置數目系統 非位置數目系統(nonpositional number system)仍然使用有限的符號,每個符號都有一個值。然而,確定符號在數字所佔的位置通常與其值無關──每個符號的值是固定的。 在此系統裡,一個數字被表示成: 其值為: p.33
範例 2.24 羅馬數字(Roman numerals)是非位置數目系統的好例子。這個系 統是由羅馬人所發明而且在歐洲使用到六世紀。目前仍使用在體 育項目、鐘面和其他應用上。這個數目系統的符號集合 S = {I, V, X, L, C, D, M},每個符號的值如表 2.3 所示。 表 2.3 羅馬數目系統的符號值 p.34
為求得數字的值,我們需要相加符號的值並遵循特殊的規則: 1. 當一個值較小的符號被放在一個大於或等於其值的符號之後, 數字的值是兩個符號相加。 2. 當一個值較小的符號被放在一個大於其值的符號之前,較大的 值要減掉較小的值。 3. 假如 S1 ≤ 10 × S2,符號 S1 就不能放在另一個符號 S2 之前。舉例 來說,I 或 V 不能放在 C 之前。 4. 要表示大的數只要在六個符號(除了 I 以外的全部符號)上面加 上一槓就表示該值乘以 1000。舉例來說,V = 5,000 而 M = 1,000,000。 5. 雖然羅馬人使用 nulla(沒有)這個字來傳達零的概念,但羅馬 數字還是缺少零這個數。 p.34