Download presentation
Presentation is loading. Please wait.
Published byYngve Christophersen Modified 5年之前
1
第二章 數字系統 課前指引 在第一章中,我們對於電腦有了初步的認識,在深入介紹電腦的各項組成元件之前,首先我們必須先了解另一種不同於人類使用習慣的二進位表示法,由於電腦的半導體、磁性、光學元件適合用來表示二進位,因此二進位表示法非常適合用來設計電腦。
2
第二章 數字系統 目前流行的電腦核心元件(例如中央處理器、主記憶體等等)皆由半導體材質製作而成,換句話說,電晶體(以半導體製作而成)是電腦核心元件的主要構成元素,而電晶體在電路中扮演著『開』與『關』的開關角色,因此,最適合以2進位來加以表示。想要更深一步了解電腦內部的運作模式,必須先學習2進位數字系統。
3
章節大綱 2.1二進制及電腦的儲存單位 2.6 浮點數表示法 2.2 數字系統 2.7 邏輯運算 2.3 轉換數字系統
2.8 文字資料表示法 2.4 正負數表示法 2.9 數碼與條碼 2.5 數值運算 2.10 錯誤檢查與更正 備註:可依進度點選小節
4
2.1 二進制及電腦的儲存單位 電腦使用的資料表示法與一般人所使用的資料表示法有很大的不同
2.1 二進制及電腦的儲存單位 電腦使用的資料表示法與一般人所使用的資料表示法有很大的不同 對於一般人來說,最常使用的是十進制、十二進制(例如一打)或六十進制(例如:時間)。十進位數(Decimal Digit)中每一個位數都有0~9等十種變化,每逢『十』就必須進位。 但實際上並非所有的現實狀況都會產生十種變化,對於某些現實狀況,採用二分法更能夠簡化問題,如圖中,我們可以用11001來表示五顆燈泡與五根水管的開關狀態。
5
2.1 二進制及電腦的儲存單位 電腦使用電子元件來儲存及運算資料,而這些電子元件通常只能夠顯示兩種狀態,即開(ON)或關(OFF),因此電腦使用的是二進位數(Binary Digit)來表示資料。 二進位的每一個位數稱之為位元(bit)。可用來表示0或1的狀態,相對於電子元件的狀態,則可以將0視為關,1視為開。 位元(bit)是記憶體的最小儲存單位,但只能夠產生2種變化(0與1),為了表達更多狀態的變化,因此必須組合多個位元。由於電腦硬體結構的定址緣故,因此,通常會將8個位元(bits)組合成1個位元組(Byte),也就是1Byte=8 bits,如此一來就可以產生28=256種變化。 一個位元組的變化足以用來表示某些英文字母、數字或符號,例如:A、a、#、、等等,也可以用來表示0~255或-128~127的數值。而中文字由於字數眾多,因此通常需要使用2個位元組來加以表示。
6
2.1 二進制及電腦的儲存單位 另一種計算存取資料的單位稱為字組(Word),一個Word究竟包含多少個Bytes,必須視硬體結構而定,一般說來,一個Word可能等於2個Bytes(16位元電腦)、4個Bytes(32位元電腦)、8個Bytes(64位元電腦)。通常一部電腦所使用的Word長度越長時,代表一次可存取的資料長度越長,因此程式執行速度可能越快(仍必須視程式所使用的指令而定)。 無論如何,Byte仍是記憶體儲存單位中最常被使用的表示單位,不過目前主記憶體或輔助記憶體的容量已經非常大,因此,我們常常會以千位元組(Kilo Bytes,簡稱K Bytes)、百萬位元組(Mega Bytes;簡稱M Bytes)、十億位元組(Giga Bytes;簡稱G Bytes)、兆位元組(Tera Bytes;簡稱T Bytes)來形容記憶體容量,其實際容量如下。 1 Byte = 8 bits 1 KBytes(KB) = 210 Bytes = 1024 Bytes (近1千) 1 MBytes(MB) = 220 Bytes = 1,048,576 Bytes (近100萬) 1 GBytes(GB) = 230 Bytes = 1,073,741,824 Bytes (近10億) 1 TBytes(TB) = 240 Bytes = 1,099,511,627,776 Bytes (近1兆)
7
2.2 數字系統 十進制是人類最常使用的數字系統(number system),每一位數共有0~9等10種變化,並且逢十進位。而六十進制一般使用在時間的表達上,也就是逢六十進位,例如:1小時=60分鐘、1分鐘=60秒。 換句話說,10進制數字系統中,每一位數可以表達0~9等變化,也就是說,10進制使用0、1、2~9等十個數字做為計數的基底(base),此基底則做為進位的準則。因此,在60進制數字系統中,基底則為0、1、2~59等六十個數字。 由於電子訊號的緣故,電腦內部的數字系統只能採用2進制(0與1的變化),但過長的01字串常常使得程式設計師閱讀不易,因而採用8進制系統(octal system)或16進制系統(hexadecimal system)來加以速記。 8進制與16進制相對於10進制而言,更容易與2進制做直覺性的轉換。 回顧日常生活所熟悉的十進制數字系統,我們可以推導出一個適合用任意數字系統的公式,然後再將此公式套用於不同的數字系統。 在十進位系統中,我們可以將一個數值分解為如下等式: = 3×102+5×101+9×100+6×10-1+8×10-2
8
2.2 數字系統 觀察上述等式,我們可以發現,10為十進制的基底,因此,我們可以將基底由十進制擴充到K進制數字系統,一個K進制的正數N可以使用下列多項式來表達: 多項式中的每一位數(Di)我們稱之為位數(Digit) 最左邊數字Dp-1稱為最高有效位數(Most Significant Digit;簡稱MSD) 最右邊數字D-q稱為最低有效位數(Least Significant Digit;簡稱LSD), 將基底K放在數值N的右下角標註,
9
2.2 數字系統 十進制(K=10)數字系統具有下列特性: 每一位數能接受的數字符號為:0,1,2,3,4,5,6,7,8,9。
2.2 數字系統 十進制(K=10)數字系統具有下列特性: 每一位數能接受的數字符號為:0,1,2,3,4,5,6,7,8,9。 每一位數所代表的量,根據其位置而有不同的指數加權(底數為10) 整數部份由小數點的左邊以10的正冪次方向左逐一遞增(次方由0開始)。 小數部份由小數點的右邊以10的負冪次方向右逐一遞減(次方由-1開始)。 10進制在做運算時,每一位數逢10向左進位。 【範例】: = (307.25)10 之位數及加權計算
10
2.2.1 二進制數字系統 半導體元件扮演的是一個類似『開關(switch)』的角色
2.2.1 二進制數字系統 半導體元件扮演的是一個類似『開關(switch)』的角色 當電壓足夠大時,開關就呈現開(ON)的現象;電壓不夠大時,開關就呈現關(OFF)的現象 因此可以從電壓分布的狀況來表示開與關兩種狀態,例如:+5V或+3.3V代表開、0V代表關。 電腦由於使用半導體製作而成,因此,電腦內部也是以0(關)、1(開)變化來表示資料。 只有0、1變化的數字系統稱為2進制數字系統。通常為了與10進制的數值有所區別,我們會在數值右下角加上一個下標2,以示區隔。
11
2.2.1 二進制數字系統 2進制數字系統有以下特性: 每一位數(Digit)只接受0、1兩種變化,因此二進制的位數又稱為位元(Binary Digit;縮寫為Bit)。 最高有效位元稱為MSB(Most Significant Bit) 最低有效位元稱為LSB(Least Significant Bit)。 每一個Bit所代表的量,根據其位置而有不同的指數加權(底數為2)。 整數部份由小數點的左邊以2的正冪次方向左逐一遞增(次方由0開始)。 小數部份由小數點的右邊以2的負冪次方向右逐一遞減(次方由-1開始)。 2進制做運算時,每一Bit逢2向左進位。 (所以12+12不是等於2,12+12是等於102)
12
2.2.1 二進制數字系統 【範例】: 之位數及加權計算如下:
13
2.2.2 十六進制數字系統 由於使用二進制來表示數值,常常會出現一連串的0、1串列,例如:245就必須使用 來表示。這一連串的0、1串列,對一般人而言,非常不容易識別與記憶,因此為了提高數值的可讀性,通常採用8進制或16進制來表示記憶體內的資料 例如傾印(dump)記憶體內容時,就常採用16進制表示。 至於為何不採用7進制或15進制呢?這則是由於8進制與16進制有非常簡單的對應規則,我們將在下一節中示範其轉換規則。
14
2.2.2 十六進制數字系統 16進制數字系統具有下列特點:
2.2.2 十六進制數字系統 16進制數字系統具有下列特點: 每一位數可能接受的數字符號為0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(其中A代表10、F代表15,依此類推。) 每一位數所代表的量,根據其位置而有不同的指數加權(底數為16) 整數部份由小數點的左邊以16的正冪次方向左逐一遞增(次方由0開始)。 小數部份由小數點的右邊以16的負冪次方向右逐一遞減(次方由-1開始)。 16進制在做運算時,每一位數逢16向左進位。 通常會將數值右下方加上16代表16進制數字,或者在數值結尾加上h或H來表示使用大小寫的16進制數字,例如:1AH、5dh。
15
2.2.2 十六進制數字系統 【範例】: 6A416之位數及加權計算如下:
16
2.2.3 八進制數字系統 在電腦領域中,八進制數字系統的使用頻率雖然不如二進制及十六進制來得多,但在某些場合中,仍然會出現,這也是因為8進制可以輕鬆轉換為2進制的緣故。 8進制數字系統具有下列特點: 每一位數可能接受的數字符號為0,1,2,3,4,5,6,7。 每一位數所代表的量,根據其位置而有不同的指數加權(底數為8)。 整數部份由小數點的左邊以8的正冪次方向左逐一遞增(次方由0開始)。 小數部份由小數點的右邊以8的負冪次方向右逐一遞減(次方由-1開始) 8進制在做運算時,每一位數逢八向左進位。 通常會將數值右下方加上8代表8進制數字,也有少許書籍會在8進制數字後面加上下標o或O來表示使用8進制數字。
17
2.2.3 八進制數字系統 【範例】 5728之位數及加權計算如下:
18
2.3 轉換數字系統 我們已經學會2進制→10進制、16進制→10進制及8進制→10進制的轉換
2.3 轉換數字系統 我們已經學會2進制→10進制、16進制→10進制及8進制→10進制的轉換 不論何種進制,基本上想要轉換為10進制,都可以依照加值法計算求得 而如果想要轉換為其他進制(例如將十進制轉換為二進制),則可以依照餘數法(remainder method)來進行轉換。 整數部份: 以原數值為被除數、目標進制的基底為除數進行除法,所得之餘數保留,然後以商與目標進制的基底為被除數及除數重複除法,直到無法再除(商數為0)為止。然後將所得之餘數反轉即可。 小數部份: 將(該數之小數部份)×(目標進制的基底),所得的整數部份保留,扣除整數部分繼續乘法,直到所指定的位數或為0時停止(若出現循環也必須停止)。所得整數部分連結即為欲轉換進制之小數部分。 【真實二進位與電腦使用二進位的差別】: 在轉換進制之前,我們必須先了解真實二進位與電腦使用二進位的差別,由於電腦的記憶體寬度有限,因此,必須使用寬度固定的二進位數字,例如當我們使用1個位元組(8個位元)來儲存二進位101011時,就必須在前面多餘的位數補上0,因此,該位元組的實際內容將會是 。
19
2.3.1 十進制轉二進制 【範例】將38.37510轉換為2進制 Step1:整數與小數部分需要分開處理。
2.3.1 十進制轉二進制 【範例】將 轉換為2進制 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,3810=(100110)2=( )2 【若需補足為1個位元組】。
20
2.3.1 十進制轉二進制 十進制轉二進制 Step4:合併整數與小數,38.37510=(100110.011)2。
2.3.1 十進制轉二進制 十進制轉二進制 Step3:求出小數部分的轉換, =(0.011)2 Step4:合併整數與小數, =( )2。
21
2.3.2 十進制轉十六進制 【範例】將766.2812510轉換為16進制 Step1:整數與小數部分需要分開處理。
2.3.2 十進制轉十六進制 【範例】將 轉換為16進制 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,76610=(2FE) 16=(02FE)16 【若需補足為2個位元組】。
22
2.3.2 十進制轉十六進制 Step3:求出小數部分的轉換,0.2812510=(0.48)16。
2.3.2 十進制轉十六進制 Step3:求出小數部分的轉換, =(0.48)16。 Step4:合併整數與小數, =(2FE.48)16。
23
2.3.3 十進制轉八進制 【範例】:將766.2812510轉換為8進制 Step1:整數與小數部分需要分開處理。
2.3.3 十進制轉八進制 【範例】:將 轉換為8進制 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,76610=(1376)8。
24
2.3.3 十進制轉八進制 Step3:求出小數部分的轉換,0.2812510=(0.22)8 。
2.3.3 十進制轉八進制 Step3:求出小數部分的轉換, =(0.22)8 。 Step4:合併整數與小數, =( )8。
25
2.3.4 二進制、八進制與十六進制的轉換 二進制與八進制、二進制與十六進制的轉換非常簡單 二進制、八進制、十六進制的對應表分別如下:
二進制、八進制與十六進制的轉換 二進制與八進制、二進制與十六進制的轉換非常簡單 當您想要轉換二進制為八進制時,可以將2進制的3個bits對應1個8進制的位數 對應時以小數點為準 整數部分由右向左計算3位數為一個單位(不足部分前面補0) 小數部份由左向右3位數為一個單位(不足部分請補尾數0)。 當您想要轉換二進制為16進制時,可以將2進制的4個bits對應1個16進制的位數 整數部分由右向左計算4位數為一個單位(不足部分前面補0) 小數部份由左向右4位數為一個單位(不足部分請補尾數0)。 二進制、八進制、十六進制的對應表分別如下: 二進制與八進制對應表 二進制 八進制 十進制 000 001 1 010 2 011 3 二進制 八進制 十進制 100 4 101 5 110 6 111 7
26
2.3.4 二進制、八進制與十六進制的轉換 二進制 十六進制 十進制 0000 0001 1 0010 2 0011 3 0100 4
二進制、八進制與十六進制的轉換 二進制 十六進制 十進制 0000 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 二進制 十六進制 十進制 1000 8 1001 9 1010 A 10 1011 B 11 1100 C 12 1101 D 13 1110 E 14 1111 F 15 二進制與十六進制對應表
27
二進制、八進制與十六進制的轉換 【範例】:將 轉換16進制
28
二進制、八進制與十六進制的轉換 【範例】:將 轉換8進制。
29
二進制、八進制與十六進制的轉換 二進制、八進制與十六進制的轉換 【範例】:將3AB.516轉換2進制。
30
2.3.4 二進制、八進制與十六進制的轉換 二進制、八進制與十六進制的轉換 【範例】:將165.48轉換2進制。
二進制、八進制與十六進制的轉換 二進制、八進制與十六進制的轉換 【範例】:將165.48轉換2進制。 【捷徑】:16進制與10進制之轉換除了可以仿照2進制與10進制的轉換規則外,也可以先透過2進制做為中繼格式再行轉換,例如:16進制→2進制→10進制。8進制與10進制的轉換也同樣可以透過2進制做為中繼格式再行轉換。
31
2.4 正負數表示法 2.3節所介紹的二進位數值表示法,可以表達正整數,但對於負整數卻無法表達。為了讓電腦也可以表達負數,數學家發明了許多的數值表示法,並且很多都可以透過邏輯電路加以實作,三種最常見的正負數表示法分別如下 『帶符號大小』 『1's補數』 『2's補數』 這三種表示法都必須事先固定位元長度 現代電腦使用的是『2's補數』表示法。 三種表示法的對照表如下: (其中2's補數的負數表示法為1's補數負數+1)
32
2.4 正負數表示法 以4位元表示正負整數值的三種表示法 對照表 十進位 帶符號大小 1's補數 2's補數 +7 0111 +6 0110
2.4 正負數表示法 十進位 帶符號大小 1's補數 2's補數 +7 0111 +6 0110 +5 0101 +4 0100 +3 0011 +2 0010 +1 0001 +0 0000 -0 1000 1111 -1 1001 1110 -2 1010 1101 -3 1011 1100 -4 -5 -6 -7 -8 無法表示 以4位元表示正負整數值的三種表示法 對照表 最左位為1一定是負整數
33
2.4.1 帶符號大小 帶符號大小的正負數表示法,顧名思義,就是有一個位元用來表示該數值為正數還是負數。這個位元通常位於最左邊
帶符號大小 帶符號大小的正負數表示法,顧名思義,就是有一個位元用來表示該數值為正數還是負數。這個位元通常位於最左邊 使用n個位元來表達正負整數時,數值的表達範圍就只剩n-1個位元可以使用,所以正整數的表達範圍是+0~+(2n-1-1) 負整數的表達範圍是-(2n-1-1)~-0 明顯地,對於0而言,使用帶符號大小表示0的時候,+0與-0是不一樣的。 以8位元來表示正負整數時,若採用帶符號大小來表示,方法則如下圖所列: 8位元的帶符號表示法
34
's補數 1’s補數(1’s complement)和帶符號表示法的原理不太相同,在1’s補數中,如果要表達負數,則必須先求得正整數,然後再將每個位元加以反相(inverse),就可以得到負整數了 所謂反相,其實就是將該位元由1變0或由0變1,如圖範例: 在圖中,我們可以很明顯看到,1's補數的轉換機制是可逆的 換句話說,當您看到一個負的1's補數二進位數字時(最左位元必為1),如果想要知道該數值代表多少,同樣可以透過反相求出該負整數的絕對值。 1's補數的正負轉換
35
's補數 2's補數(2's complement)是一個最完美的正負二進位整數的表示法,它是基於1's補數演變而來(同樣必須限制表示的位元寬度),也就是當我們要將一個二進位整數變號時,只需要先將其1's補數求出,然後再加1,就可以得到2's補數了,如圖所示: 2's補數的正負轉換
36
2.4.3 2's補數 2's補數的轉換機制對於『正整數轉負整數』或『負整數轉正整數』所使用的方法都是一樣的
+0與-0的表示法相同。以8個位元來表示+0與-0,都是 。 可以透過最左邊的位元快速判定該數為正整數或負整數。 (最左邊位元為0,一定是正整數或0)。 負整數的表達範圍更大, 它可以表達的整數範圍是 +(2n-1-1) ~ -2n-1(位元寬度為n時)。 而-2n-1的表示法就是1000…0002。 可以輕易地使用邏輯電路實作加/減法器,並且正負數轉換機制相同,因此不必額外設計一套電路。
37
2.4.3 2's補數 正負數表示法比較表 帶符號大小 1's補數 2's補數 採用 非個人電腦採用 個人電腦採用 優點
1.最左邊位元可判定正負數。 2.對人來說非常簡單,容易理解。 2.轉換機制是可逆的。 3.可以透過邏輯電路輕鬆設計完成反相。 2.+0與-0表示法相同。 3.表達範圍是 +(2n-1-1) ~ -2n-1。 4.轉換機制是可逆的。 5.可以輕易地使用邏輯電路實作相關應用電路。 缺點 1.不容易使用邏輯電路實作相關應用電路。 2.表達範圍是+0 ~ +(2n-1-1)、 -(2n-1-1) ~ -0。 3.+0與-0表示方式不同。 1.必須限制表示的位元數。 2.表達範圍是+0~ +(2n-1-1)、 -(2n-1-1) ~ -0。 必須限制表示的位元數。 正負數表示法比較表
38
2.5 數值運算 二進位數字的數值運算和十進位非常相近,在本節中,我們將以正整數為例,介紹二進位數字的四則運算。
2.5 數值運算 二進位數字的數值運算和十進位非常相近,在本節中,我們將以正整數為例,介紹二進位數字的四則運算。 對於純數學的二進位正整數的四則運算而言,並不會規定位元長度範圍,但由於實際設計電路的關係,我們必須強制規定運算來源與運算結果的位元長度,當超過表示範圍時,則會發生溢位現象。
39
2.5.1 加法 假設我們要做 與100011的加法,並使用8個位元來存放被加數與加數,結果則以8位元加以存放,則加法步驟如下: (與10進位加法沒有太大差別,只要把握逢2進位原則即可) Step1:被加數與加數的不足位數部分先補0。 如同右圖的直式加法。 Step2:由右至左,使用如下公式進行加法。 下圖是右邊倒數第二位加法遇到進位時的狀況。 被加數 + 加數 = 結果 1 0,但進位1
40
2.5.1 加法 加法 Step3:當考慮由前面位元加法所得的進位狀況時,則將公式修改為下表繼續運算:
2.5.1 加法 加法 Step3:當考慮由前面位元加法所得的進位狀況時,則將公式修改為下表繼續運算: Step4:不斷的由右至左進行上述加法,最後可以得到右圖結果。所以相加結果為 。 進位 + 被加數 加數 = 結果 1 1 (不必進位) 0,但進位1 1,但進位1
41
2.5.1 加法 【溢位】: 溢位(overflow)是二進位邏輯電路在計算加法或減法時可能會出現的一種現象,由於使用邏輯電路表達二進位資料時,必須限制位元長度,因此,當相加或相減的結果超過表達範圍時,就發生了溢位現象。 舉例來說,當使用8個位元表達二進位數字時(使用2's補數),可表達的範圍是 -128~+127。 因此,當+127+1(也就是 )時,將會得到 ,但 是-128,而不是+128(因為+128已經超過表達範圍),此時就發生溢位現象。 通常我們可以依據下列原則判斷是否發生溢位現象: (1)當運算結果超出表達範圍。 (2)正負符號出現異常狀況,例如:正整數+正整數的答案應該也是正整數,而運算結果的左邊第一位元顯示為負數時(也就是正負符號為1),就代表發生了溢位現象。 (3)使用XOR判斷法,XOR為一種互斥運算。
42
2.5.2 減法 減法其實只是加法的延伸,我們可以把減數取負數變成加數,就可以使用加法原理來加以計算,例如:X-Y=X+(-Y)。
2.5.2 減法 減法其實只是加法的延伸,我們可以把減數取負數變成加數,就可以使用加法原理來加以計算,例如:X-Y=X+(-Y)。 如果要把二進位減法使用加法來實踐,我們必須使用2's補數來表達負數,而且結果可能會出現超過位元長度的現象,此時只要將多出的位元去除即可,如下範例: 以上使用2's補數以加法進行減法運算,是電腦內部進行減法所採用的策略。除了使用加法來實踐減法之外,我們也可以使用過去十進位減法的方式來計算二進位減法,如下範例:
43
2.5.2 減法 Step1:被減數與減數的不足位數部分先補0。如同下圖的直式減法。
2.5.2 減法 Step1:被減數與減數的不足位數部分先補0。如同下圖的直式減法。 Step2:由右至左,使用如下公式進行減法。下圖是遇到需要借位時的狀況。 被減數 - 減數 = 結果 1 1,但需借位
44
2.5.2 減法 Step3:當考慮由前面位元減法所得的借位狀況時,則將公式修改為下表繼續運算:
2.5.2 減法 Step3:當考慮由前面位元減法所得的借位狀況時,則將公式修改為下表繼續運算: Step4:不斷的由右至左進行上述減法,最後可以得到右圖結果。所以相減結果為11010。 借位 + 被減數 - 減數 = 結果 -1 1,但需借位 1 0,但需借位 0 (不需借位)
45
2.5.3 乘法與除法 二進位乘法與除法與過去的十進位乘除法觀念大同小異,如下範例:
2.5.3 乘法與除法 二進位乘法與除法與過去的十進位乘除法觀念大同小異,如下範例: 通常邏輯電路計算二進位正整數乘除法時,必須考慮以下事項: (1)若被乘數與乘數使用n個位元表達時,則乘積必須使用2n的位元長度來表達。 (2)若執行除法時,必須將結果的商與餘數分開存放。
46
2.6 浮點數表示法 儲存整數可以使用2's補數表示法來存放,但若要存放的資料是代表小數的數值資料時,則必須使用浮點數表示法(floating-point notation)。浮點數表示法是由科學記號表示法演變而來,與整數資料的儲存法有很大的差別。 整數資料的小數點,「固定」在最右邊的位元之後,而浮點數表示法的小數點位置則必須由數值與精確度來決定 小數點位置是「浮動」的,因此稱為浮點數表示法。 浮點數表示法並不唯一但原理則大同小異,不同電腦採用不同的浮點數表示法 例如:Intel CPU支援了單倍精準度浮點數(single precision)、雙倍精準度浮點數(double precision)、延伸精準度浮點數(extended precision)三種浮點數表示法,並且分別佔用32、64與80個位元長度。
47
2.6 浮點數表示法 任何浮點數表示法的存放都可以切割為3個部分,分別是正負符號位元(signed bit)、偏移指數(biased exponent)、小數部分(mantissa),以Intel CPU的單倍精準度浮點數為例,它將佔用32個位元長度,其格式如下: 正負符號位元:正負符號位元固定只有一個位元,用來表示正數(符號位元為0)或負數(符號位元為1)。 偏移指數:偏移指數欄位的位元數並不固定,必須視該浮點數的電腦系統如何實作,以及想要表達多少數值來決定。 偏移指數必須減掉系統定義的指數偏移值才是實際的指數,公式如下: 實際指數 = 偏移指數 – 指數偏移值
48
2.6 浮點數表示法 舉例來說,Intel CPU單倍精準度浮點數的偏移指數欄位使用8個位元,應該可以表達0~255之間的整數值,但是80486 CPU採用127做為指數偏移值,所以真實的正指數應該是0~128(當b30b29‥‥b23=127~255時);至於b30b29‥‥b23=0~126時,則真實的負指數應該是-127~-1。所以偏移指數所能表達的實際指數為-127~128(而且底數為2)。
49
2.6 浮點數表示法 小數部分:小數部分欄位的位元數並不固定,必須視該浮點數想要表達的精確度而定。小數部分存放的資料是經由正規化並調整隱藏位元之後的小數部分,當小數過長時,則必須去除尾部多餘的小數,因此,會影響儲存的精確度。 正規化(normalization)是將小數調整為0.1‥‥1×2n的步驟,舉例來說, = ( )2 = ×26。 隱藏位元則是為了提高精確度而設計的預設位元,例如Intel CPU的隱藏位元為1,因此,我們可以將小數再往前移動一個位數,也就是 = ( )2 = ×26= ×25。所以小數位數存放的是 ‥‥,其中‥‥代表許多的0,至於有多少個0則必須視「小數部分」欄位的位元數而定。 Intel CPU浮點數求小數部分的步驟
50
2.6 浮點數表示法 正規化(normalization)是將小數調整為0.1‥‥1×2n的步驟,舉例來說, = ( )2 = ×26。 隱藏位元則是為了提高精確度而設計的預設位元,例如Intel CPU的隱藏位元為1,因此,我們可以將小數再往前移動一個小數點,也就是 = ( )2 = ×26= ×25。所以小數位數存放的是 ‥‥,其中‥‥代表許多的0,至於有多少個0則必須視「小數部分」欄位的位元數而定。 Intel CPU浮點數求小數部分的步驟
51
2.6 浮點數表示法 【範例】假設Intel CPU單倍精準度浮點數如下所列,試問表達的數值為多少: 【解答】
52
2.6 浮點數表示法 【範例2】:試將 以Intel CPU單倍精準度浮點數存放。 【解答】
53
2.6 浮點數表示法 【IEEE 754】: IEEE(Institute of Electrical and Electronics Engineers;美國電子電機工程協會)是一個制定各項標準的協會,對於電腦領域非常重要,例如網路、無線網路等都由該協會負責制定標準,供各家廠商實作,以達到產品互通的用意。 而IEEE也針對浮點數制定了標準格式,即IEEE Std ,包含單精確度(32位元)、雙精確度(64位元)、延伸單精確度(43位元,少使用)與延伸雙精確度(79位元以上)等四種模式。但只有32位元模式為強制要求。通常在標準制定之後發明的程式語言(例如Java)都支援該格式的浮點數標準。
54
2.7 邏輯運算 由於二進位數只有0與1兩種數值,因此恰好可以用來表示真(True)與假(False)兩種邏輯狀態。『真與假』就像『是與否』,可以決定某一事實是否成立 例如日常生活中,我們會問「你吃過飯了嗎?」,答案非『是』即『否』。 對於電腦而言,二分法是最基本的分類方法,對於比較複雜的狀況,我們則可以透過邏輯運算子(logical operator)將各類狀況加以組合。 專門用來進行只有0與1的邏輯運算函數稱之為布林函數(Boolean Function),其定義域與對應域都只有0與1兩種狀況,也就是真或假。 通常我們會透過真值表(Truth Table)來表現布林函數所有變數與函數值之間的對應關係。 以下,我們將透過真值表來介紹各類邏輯運算子,每一個邏輯運算子都可以視為一個基本的布林函數,而其運算變數則稱之為運算元(operand)。
55
2.7 邏輯運算 AND: AND可以用來表示『且』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。
2.7 邏輯運算 AND: AND可以用來表示『且』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,只有在兩個輸入運算元同時為1時,才會輸出1。 AND的代表符號為『.』或『*』或根本簡略不寫。所以AND的布林函數F(X,Y)=X.Y或F(X,Y)=X*Y或F(X,Y)=XY。 X Y X AND Y 1 真值表: X AND Y
56
2.7 邏輯運算 OR: OR可以用來表示『或』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。
2.7 邏輯運算 OR: OR可以用來表示『或』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,只要兩個輸入運算元的其中有一個為1時,就會輸出1。 OR的代表符號為『+』。所以OR的布林函數F(X,Y)=X+Y。 X Y X OR Y 1 真值表: X OR Y
57
2.7 邏輯運算 NOT: NOT可以用來取補數,是單元運算子,接受一個輸入運算元,並產生一個輸出。
2.7 邏輯運算 NOT: NOT可以用來取補數,是單元運算子,接受一個輸入運算元,並產生一個輸出。 真值表如下,若輸入為1則輸出為0,若輸入為0則輸出為1 NOT的代表符號為『'』、『﹁』、『~』或『 ̄』。所以NOT的布林函數F(X)=X'或F(X)=~X或F(X)= ﹁X或F(X)= X X NOT X 1 真值表: NOT X
58
2.7 邏輯運算 XOR: XOR稱為互斥或(exclusive OR)運算,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。
2.7 邏輯運算 XOR: XOR稱為互斥或(exclusive OR)運算,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,當兩個輸入運算元的值不同時,才會輸出"1",否則輸出"0"(當兩個輸入訊號相同時)。 通常XOR邏輯運算符號為"XOR"或"⊕"。所以XOR的布林函數F(X,Y)=X⊕Y。 X Y X XOR Y 1 真值表: X XOR Y
59
2.7 邏輯運算 【範例】假設布林函數(X,Y,Z)=X‘YZ+(X'Y)(Y+Z')+(X'+Z')',請問F(1,0,1)=? 【解答】
2.7 邏輯運算 【範例】假設布林函數(X,Y,Z)=X‘YZ+(X'Y)(Y+Z')+(X'+Z')',請問F(1,0,1)=? 【解答】 F(1,0,1) = 1' * 0 * 1 + ( 1' * 0 ) * ( 0 + 1' ) + (1' + 1')' = 0 * 0 * 1 + ( 0 * 0 ) * ( ) + (0 + 0)' = 0 * 0 * 1 + ( 0 ) * ( 0 ) + (0)' = = 1
60
2.8 文字資料表示法 前面章節介紹了數值資料在電腦的存放方式,而文字資料又是如何被放到記憶體的呢?由於每一個記憶體單元只能接受0、1等2進制的表示法,因此文字資料必須先經由編碼(encode),使得不同的字元對應到唯一的位元圖樣(bit pattern),然後才能存入記憶體中。 目前最普遍的編碼為ASCII,繁體中文則為Big5碼。 此外,為了統一各國文字的編碼方式,另外也發展了Unicode編碼方式,目前常見的部落格網站也大多以Unicode編碼方式撰寫。 文字資料經由編碼後存放到記憶體中
61
2.8.1 ASCII碼 ASCII碼(American Standard Code for Information Interchange,唸做as-key) 為美國國家標準局所制定的一種編碼方式,目的是提供一個各類電腦皆通用的編碼方式以便於這些電腦可以互通訊息。 ASCII碼為7個bits,因此可以產生128種變化,每一個變化都可以用來表示一個特殊字符,其中的95個字符為可列印字符,而剩餘的字符則為不可列印的特殊控制字符,例如:換列、倒退鍵、歸位等。 由於1個Bytes為8個bits,因此留下剩餘的1個bit並無任何作用,有時將該位元用來記錄同位位元檢查(詳見2.10節) ASCII的應用實例非常多,例如您在個人電腦的鍵盤按下一個『H』鍵,它將會被轉換為4816,就是ASCII碼的 ,然後再存入記憶體中。 雖然ASCII是目前最普遍的編碼系統,但並非所有的系統都採用這種編碼方式,例如IBM機器(非IBM PC)則採用8位元碼EBCDIC(Extended Binary Coded Decimal Interchange Code)或ASCII-9,以便表達較多的字元變化。 詳細的ASCII碼如表所列。
62
2.8.1 ASCII碼 ASCII字元集列表 00 NULL 1 01 SOH 2 02 STX 3 03 ETX 4 04 EOT 5
十進位 十六進位 ASCII字元 00 NULL 1 01 SOH 2 02 STX 3 03 ETX 4 04 EOT 5 05 ENQ 6 06 ACK 7 07 BEL 8 08 BS 9 09 HT 10 0A LF 11 0B VT 12 0C FF 13 0D CR 14 0E SO 15 0F SI : 十進位 十六進位 ASCII字元 48 30 49 31 1 50 32 2 51 33 3 52 34 4 53 35 5 54 36 6 55 37 7 56 38 8 57 39 9 58 3A : 59 3B ; 60 3C < 61 3D = 62 3E > 63 3F ? 十進位 十六進位 ASCII字元 65 41 A 66 42 B 67 43 C 68 44 D 69 45 E 70 46 F 71 47 G 72 48 H 73 49 I 74 4A J 75 4B K 76 4C L 77 4D M 78 4E N 79 4F O 80 50 P : 十進位 十六進位 ASCII字元 97 61 a 98 62 b 99 63 c 100 64 d 101 65 e 102 66 f 103 67 g 104 68 h 105 69 i 106 6A j 107 6B k 108 6C l 109 6D m 110 6E n 111 6F o 112 70 p : ASCII字元集列表
63
2.8.2 中文內碼 中文字與英文字差異極大,英文單字是由許多字母所組成,由於大小寫字母與標點符號加起來並不會超過128種變化,因此可以使用ASCII碼來表示,也就是使用1個位元組就可解決每一個字母的表示法。 而中文字多達數萬字,因此必須使用2個位元組來儲存一個中文字型的內碼,通常我們將這種編碼方式稱為『雙位元組編碼』,就中文而言則稱為「中文內碼系統」。 初期國內發展中文系統時,發展了許多種的中文內碼,例如:BIG5(也可以寫作Big-5;稱為大五碼)、王安碼、CCCII碼(Chinese Character Code for Information Interchange)。不過目前大多以資策會在1984年所制定的Big-5碼做為中文系統 Big-5碼共提供了五千多個常用字,七千多個次常用字,另外尚有499個特殊符號,因此一共約制訂一萬三千多個中文字內碼 一部份的Big-5碼如下表所列(完整的Big-5碼請至
64
2.8.2 中文內碼 部分BIG5字元表 內碼 字符 B140 莆 B141 莧 B142 處 B143 彪 B144 蛇 B145 蛀
2.8.2 中文內碼 內碼 字符 B140 莆 B141 莧 B142 處 B143 彪 B144 蛇 B145 蛀 B146 蚶 B147 蛄 B148 蚵 B149 蛆 B14A 蛋 B14B 蚱 B14C 蚯 B14D 蛉 B14E 術 B14F 袞 B150 袈 B151 被 B152 袒 B153 袖 B154 袍 B155 袋 B156 覓 B157 規 B158 訪 B159 訝 B15A 訣 B15B 訥 B15C 許 B15D 設 B15E 訟 B15F 訛 B160 訢 B161 豉 B162 豚 B163 販 B164 責 B165 貫 B166 貨 B167 貪 B168 貧 B169 赧 B16A 赦 B16B 趾 B16C 趺 B16D 軛 B16E 軟 B16F 這 B170 逍 B171 通 B172 逗 B173 連 B174 速 B175 逝 B176 逐 B177 逕 B178 逞 B179 造 B17A 透 B17B 逢 B17C 逖 B17D 逛 B17E 途 B1A1 部 B1A2 郭 部分BIG5字元表
65
2.8.2 中文內碼 【深入探討Big5】 Big5碼使用兩個位元組來存放資料,而ASCII使用一個位元組來存放資料,假設我們的文章中出現中英混雜的狀況時(例如:『m乘n 』),電腦是如何判斷哪些是中文字,哪些又是英文字母呢? Big5的第一個位元組規定一定要比127還要大,如此使用Big5內碼的電腦發現第一個位元組超過127(也就是7F)時,就可以判定為中文 例如:『m乘n 』實際上的資料應該是『6DADBC6E』,電腦預定每次讀取一個位元組,當讀到『6D』時,發現比7F還要小,所以直接輸出『m』;當讀到『AD』時,發現比7F還要大,所以必須再讀取一個位元組『BC』,組成Big5碼『ADBC』後,透過查表對應到『乘』,然後才輸出『乘』;最後又讀取一個位元組,讀到『6E』,發現比7F還要小,所以直接輸出『n』,而成為我們看到的『m乘n 』。 事實上,128(即A016)也不會出現在Big5碼的第一個位元組, Big5碼的第一個位元組只可能出現(A116 - F916)的數值, 同時也不是每一個數值都對應了中文字元(只有 =87個數值有用)
66
2.8.2 中文內碼 關於Big5的第一個位元組規定如下:
2.8.2 中文內碼 關於Big5的第一個位元組規定如下: 至於Big5的第二個位元組則介於 FE16,並且也不是全部都有用到(只有其中的63+94=157個數值有用),關於Big5的第二個位元組規定如下: 分類區 範圍 統計 符號區 A1 - A3 3 sectors 常用字區 A4 - C6 35 sectors 未定義區 C7 - C8 2 sectors 次常用字區 C9 - F9 49 sectors Big5的第一個位元組 分類區 範圍 統計 第一部份 40 - 7E 63 codes 未定義區 7F - A0 34 codes 第二部分 A1 - FE 94 codes Big5的第二個位元組
67
2.8.2 中文內碼 所以Big5共定義了87*157=13659個中文字。光是這些中文字夠用嗎?
2.8.2 中文內碼 所以Big5共定義了87*157=13659個中文字。光是這些中文字夠用嗎? 答案當然是不夠的,話說Big5之所以叫Big5,是因為該碼是在1984年由台灣五家電腦公司共同推動,事實上,在這之前,國字整理小組已經整理出七萬多個中文字,而Big5只能容納一萬三千多個中文字,所以根本不夠用,而且連五家電腦公司之一的宏碁的「碁」都打不出來,更不用說,打不出游錫「堃」等字。 由於Big5不夠使用,因此後來又出現了一些改良版,如Big5_Eten、Big5-HKSCS、BIG5E及Big5_unicode等等,而原本的Big5碼則稱為Big5_1984。 由於版本如此之多,因此也使得軟體支援Big5碼出現不統一的現象。而面對這個問題,大家已經不想直接在Big5方面著手解決,而期望未來採用Unicode碼加以解決。
68
2.8.3 Unicode 除了中文問題之外,事實上許多非英語系國家也面臨文字數量過多的問題,因此,為了統一解決這些問題,又發展了另一套編碼系統,稱之為Unicode。 Unicode是依據ISO/IEC 10646標準所制定的一套通行全球的編碼系統,Unicode使用2個位元組來表示字元符號,因此可以產生65536個字元,其中最前面的128個字元與ASCII相同。 使用Unicode將可以讓電腦處理目前人類所遭遇的所有語系文字,例如:英文、中文、日文、法文、拉丁文‥‥等等,而不需要為各種不同語系設計不同的編碼系統,因此在網際網路中,尤其容易見到。
69
2.8.3 Unicode 編輯時無法直接輸入的字元,可以先用Unicode代碼來輸入,瀏覽器自會解讀
部分Big5未收編的文字,可以使用Unicode編碼來加以解決
70
2.8.3 Unicode Unicode的優點 由於網際網路的發達,因此,跨國性的文件常常會被採用,例如:我們很可能會到大陸網站找尋資料。由於台灣使用的字集是繁體中文字集Big5,而大陸則使用簡體中文字集GB2312,因此,若使用繁體中文的瀏覽器閱讀簡體網頁時,會發生衝碼現象,也就是可能會出現一些亂碼和部分的繁體中文,這是由於簡體中文內碼恰好對應到某個繁體中文的內碼。 而瀏覽網頁發生衝碼現象,主要源自網頁採用各國自行制定的內碼所致,若使用Unicode進行編碼的話,就不會發生這種現象,因為Unicode已經將各國編碼系統打亂,重新制定為單一的編碼系統,而Unicode的前128個字元碼則與ASCII具有相同值。並且大多數的瀏覽器都已經支援了Unicode字集,以便顯示包含各國文字的網頁。
71
2.8.3 Unicode UTF-16與UTF-8 Unicode使用16位元進行各國文字的編碼,這種格式稱之為UTF-16。但是對於某些全部都是英文的文件而言,使用UTF-16的16個位元存放英文字母,顯得有些浪費(因為雖然前128個字元值與ASCII相同,但卻必須使用兩個位元組來存放),因此Unicode提供了另一種UTF-8的儲存格式。 UFT-8的編碼長度並不是固定的8個位元,而是一種可變動式的編碼長度,例如,英文會以8個位元來儲存,但中文就會以24個位元來儲存,因此,如果是中文字出現頻率較高的文件,使用UTF-16格式儲存會比UTF-8來得節省空間。
72
2.9 數碼與條碼 雖然電腦只看的懂0與1,但是0與1並不是只能用來表達二進位數值而已,只要經過定義,0與1還可以變成許多不同特性的數碼系統,例如:BCD、二五碼、五取二碼、超三碼、葛雷碼等等 這些碼在特定用途或設計時,能夠產生作用 (例如可輕易檢查錯誤或利於直接轉換為10進位)。 在本節中,我們將選擇幾種常見且基本的數碼系統加以解說。
73
2.9.1 BCD碼與加權碼 BCD碼(Binary Coded Decimal) 顧名思義,就是使用二進位的0、1對十進位的數字進行編碼
十進位數字 BCD碼 0000 5 0101 1 0001 6 0110 2 0010 7 0111 3 0011 8 1000 4 0100 9 1001
74
2.9.1 BCD碼與加權碼 因此,當使用BCD碼表達215時,必須將十進位的每一個位數(2、1、5)一一對應到4個位元的BCD碼(0010、0001、0101),並且不可以省略前面多餘的0。為了區分二進位數值與BCD碼,因此,我們會在BCD碼的後面加上BCD,或者將BCD註明為下標。如右範例: BCD碼在十進位的七段顯示器電路中,可見到其應用,這是因為當我們為了BCD碼而特別設計一些電路時,就可以省去二進位轉換十進位時的計算時間。 【加權碼】: 凡是每個位元擁有固定加權值的數碼皆稱為加權碼(Weighted Codes),例如:BCD碼就是一種加權碼。
75
2.9.2 超三碼與自補碼 超三碼(Excess-3) 也是使用4個位元來對應0~9十個數字,但它並非一種加權碼。
2.9.2 超三碼與自補碼 超三碼(Excess-3) 也是使用4個位元來對應0~9十個數字,但它並非一種加權碼。 超三碼就和它的名字一樣,我們只要把BCD的每個單位再加上3,就可以得到超三碼了。 因此,十進位0~9所對應的超三碼就如同下表: 十進位數字 BCD碼 超三碼 0000 0011 5 0101 1000 1 0001 0100 6 0110 1001 2 0010 7 0111 1010 3 8 1011 4 9 1100 BCD碼與超三碼
76
2.9.2 超三碼與自補碼 十進位的0~9可以對切為0~4與5~9,而0與9相加恰好為9,1與8相加也是恰好為9(2與7、3與6、4與5也是如此) 因此,當您將某一種數碼系統分為兩大部分,而且每一個數值都可以恰好找到唯一的一個互補數(相加為固定值)時,該數碼系統就具有自補(Self-Complement)特性,並且稱為自補碼(Self-Complementing Codes)。 至於超三碼為何要將BCD碼加3呢?這是也為了符合自補特性,只要您將超三碼對切後,就可以為每個單位找到相加恰為1111的互補數了。 十進位、二進位與超三碼都是自補碼
77
2.9.3 葛雷碼【選讀】 本節內容對於通訊、應數科系較為重要,或包含數位邏輯設計課程之科系也可將之選讀。 葛雷碼(Gray Codes)
2.9.3 葛雷碼【選讀】 本節內容對於通訊、應數科系較為重要,或包含數位邏輯設計課程之科系也可將之選讀。 葛雷碼(Gray Codes) 葛雷碼是一種非常特殊的數碼,連續兩個數字的葛雷碼,只會有一個位元不相同,其餘位元則完全相同,且葛雷碼也不是唯一的,只要符合漢明距離為1的規定即可。 例如:{0=00,1=01,2=11,3=10}是一組二位元的葛雷碼,因為每兩個數字間只有一個位元不同,而{0=01,1=11,2=10,3=00}、{0=11,1=10,2=00,3=01}與{0=10,1=00,2=01,3=11}也分別是一組二位元的葛雷碼,因為它們同樣符合漢明距離為1的規定。 由此可知,當設計出一組葛雷碼之後,採其循環的任一組都可以是葛雷碼,故葛雷碼又稱為循環碼。 【漢明距離】: 漢明距離(hamming distance)的定義是兩組數字之間不同位元值的數量,因此,任何連續兩個葛雷碼數字之間的漢明距離為1。
78
2.9.3 葛雷碼【選讀】 要如何設計葛雷碼呢? 有一個簡單的辦法,先以二進位的0(例如0000)為基礎,然後從LSB開始調整一個位元,若已調整過該位元(再調則會重複),則調整更高的一個位元,如此就能設計出一個葛雷碼 以此方法找出的四位元葛雷碼如下: 十進位 葛雷碼 設計說明 0000 與二進位的0相同即可。 1 0001 最末位調為1,0001未出現→OK。 2 0011 最末位調為0,0000→ X。末二位調為1,0011未出現→OK。 3 0010 最末位調為0,0010未出現→OK。 4 0110 最末位調為1,0011→ X。末二位調為0,0000→ X。 末三位調為1,0110未出現→OK。
79
最後檢驗,1000與0000也只有相差一個位元,故此為葛雷碼
2.9.3 葛雷碼【選讀】 十進位 葛雷碼 設計說明 5 0111 最末位調為1,0111未出現→OK 6 0101 最末位調為0,0110→ X。末二位調為0,0101未出現→OK。 7 0100 最末位調為0,0100未出現→OK。 8 1100 最末位調為1,0101→ X。末二位調為1,0110出現過→ X。 末三位調為0,0000→ X。最高位調為1,1100未出現→OK。 9 1101 最末位調為1,1101未出現→OK 10 1111 最末位調為0,1100→ X。末二位調為1,1111未現過→OK。 11 1110 最末位調為0,1110未出現→OK。 12 1010 最末位調為1,1111→ X。末二位調為0,1100→ X。 末三位調為0,1010未出現→OK 13 1011 最末位調為1,1011未出現→OK 14 1001 最末位調為0,1010→ X。末二位調為0,1001未現過→OK。 15 1000 最末位調為0,1000未出現→OK 最後檢驗,1000與0000也只有相差一個位元,故此為葛雷碼
80
2.9.3 葛雷碼【選讀】 上述方法成功找出了四位元的葛雷碼,可用來表達16種不同的狀況,而如果想要表達的狀況只有10種的時候,我們並不能直接取前面的10個數字來作為葛雷碼 原因在於1101(對應9)與0000(對應0)相差不只一個位元。 不過,如果取第3~12個數字時,則仍為可表達10種狀況的一組葛雷碼,因為1010與0010也只相差一個位元。而此碼稱之為餘3循環碼。 也就是取該組的10個數值,不論如何循環,都可以當作10種狀況的葛雷碼。
81
2.9.3 葛雷碼【選讀】 反射葛雷碼 不唯一的葛雷碼對於實務上並沒有太多的用處,因為很難當作為一種標準,因此,又發展出所謂的反射葛雷碼(Reflected Gray Codes) 反射葛雷碼『具有唯一性』,其n+1個位元的反射葛雷碼可用遞迴方式定義如下: (上標ref代表將該反射葛雷碼順序顛倒)
82
2.9.3 葛雷碼【選讀】 由上述遞迴定義,我們可以推導出一位數的反射葛雷碼G1、二位數的反射葛雷碼G2、三位數的反射葛雷碼G3‥‥如下,並可以清楚地看到反射(reflect)現象,亦即除了最高位元不同外,其餘則為對稱反射。 反射葛雷碼
83
2.9.3 葛雷碼【選讀】 以二進位數字求反射葛雷碼 由於反射葛雷碼具有唯一性,因此二位進系統轉換為反射葛雷碼的結果是固定的,並且非常簡單,只需要做互斥或(Exclusive OR;XOR)運算即可 假設我們要求二進位數字BnBn-1‥‥B1的反射葛雷碼GnGn-1‥‥G1,則可以透過下列公式求得:
84
2.9.3 葛雷碼【選讀】 舉例來說,當我們想要求出 的反射葛雷碼時,則按照下列算法即可求出反射葛雷碼為110111:
85
2.9.3 葛雷碼【選讀】 以反射葛雷碼求對應的二進位數字
2.9.3 葛雷碼【選讀】 以反射葛雷碼求對應的二進位數字 假設我們要將反射葛雷碼GnGn-1‥‥G1轉換為二進位數字BnBn-1‥‥B1也非常簡單,同樣透過互斥或運算即可求得,公式如下:
86
2.9.3 葛雷碼【選讀】 反射葛雷碼的應用 舉例來說,當我們轉換反射葛雷碼110111為二進位數字1001012時,可以按照下列算法:
2.9.3 葛雷碼【選讀】 舉例來說,當我們轉換反射葛雷碼110111為二進位數字 時,可以按照下列算法: 反射葛雷碼的應用 反射葛雷碼應用在許多通訊與資訊領域,例如位置編碼器、河內塔問題、漢米爾頓循環、基因演算法、卡諾圖、數位通訊之錯誤修正、計數器等方面,主要是因為它每次只會產生一個位元變化的特性。
87
2.9.4 條碼 在日常生活中,我們可以發現許多商品上面都有條碼(Bar Codes;barcode)
2.9.4 條碼 在日常生活中,我們可以發現許多商品上面都有條碼(Bar Codes;barcode) 條碼是利用粗細不等的線條所組成,至少可以用來表示0~9等十進位數字,並且可以透過光學條碼掃描機(bar code reader),將資料輸入電腦之中 由於條碼不具方向性,對於商品資料的快速輸入,有很大的幫助,因此條碼目前已經成為商品資料表示法的主流。
88
2.9.4 條碼 上述之條碼稱為一維條碼,當掃描時只需要掃描橫向的所有線條即可,因為一維條碼上下是完全相同的,只有左右、粗細、黑白線條等具有意義。 而後來又發明了二維條碼,它除了左右、粗細、黑白線條有意義之外,上下的黑點也具有意義,因此可以存放較多的資料。例如用來報稅的資料就可以採用二維條碼來存放。 二維條碼
89
2.10 錯誤檢查與更正 資料必須流動才能夠達到交換的目的,而資料的流動可能透過電、磁、光等媒介進行,在資料流動的過程中,可能會遭遇人為或非人為因素(例如雷電、電磁波)的影響,使得原本送出的位元圖樣與接收端的位元圖樣出現不一致的現象。 雖然目前製造技術的進步,使得儲存體與傳送媒介可以承受更大的外在因素影響,但資料發生錯誤的機率,不可能降為0。所以仍然需要應用某些編碼技術來確保資料的正確性 由於這些編碼技術歷史悠久,因此早已被包含在電腦內部元件之中,在本節中,我們將簡單介紹幾種常見的錯誤檢查與更正的編碼技術。
90
同位位元檢查 同位位元檢查(parity bit check)是一種偵測錯誤的技術,在送出資料之前,先加上一個同位位元(一般會加在前面),然後才將資料傳送出去,接收端於收到資料後,會檢查每個位元一共包含奇數個1或偶數個1,以便判斷傳輸過程中,是否發生錯誤。 同位位元檢查又可以分為奇同位檢查(odd parity check)與偶同位檢查(even parity check)。 顧名思義,奇同位檢查的資料位元與同位位元合計一共應該有奇數個1; 偶同位檢查的資料位元與同位位元合計一共應該有偶數個1 若接收端發現資料不符合此項規則,則代表資料在傳輸過程中發生了錯誤。(但並非符合規則就是沒有錯誤) 假設,我們採用奇同位檢查,傳送大寫英文字母Q與U,其ASCII碼分別為 (Q)與 (U),在傳送資料之前,必須先將同位位元加在前面,也就是 (Q)與 (U),使得位元圖樣共有奇數個1,如下圖所示。 奇同位檢查
91
同位位元檢查 對於接收端而言,當它收到 與 資料時,會先檢查是否每一筆位元圖樣都恰好有奇數個1,如果確實如此,則視為正確,便將同位位元去除,取出原始資料 (Q)與 (U); 如果發現位元圖樣出現偶數個1,則視為資料錯誤,此時可以要求重新再送一次資料,或產生錯誤訊息。 奇同位檢查運作流程
92
同位位元檢查 使用同位檢查技術,對於所有的「奇數個位元的錯誤」而言,一定可以被檢測出來;但偶數個(兩個、四個‥‥)位元同時發生錯誤時,將無法發現錯誤。 由於同位位元只會使得原本的資料長度多一個位元(甚至不會浪費位元數,例如可以善用ASCII多餘的一個位元來當作同位位元),所以並不會太佔用空間。 況且,由於硬體實作或軟體實作只需要使用XOR與NOT兩種邏輯運算即可實現同位檢查,因此雖然無法找出所有的錯誤,但同位檢查技術仍舊被許多應用所採用。
93
循環冗餘碼(CRC) 奇偶同位檢查法雖然實作簡便,但卻無法偵測出偶數個位元同時出錯的現象。相形之下,循環冗餘碼(Cyclic Redundancy Check codes)的錯誤檢查能力就強多了,但在實作上也必須使用較複雜的電路。 使用CRC檢查資料傳送過程是否發生錯誤,首先傳送端與接收端必須先協定一個生成多項式(generator polynomial) 傳送端在送出資料之前,必須先將資料位移後,以一種特殊的除法(稱為module-2除法),先除以生成多項式,並將餘數加在原始資料後面,一併傳送出去。 接收端於收到資料之後,將資料(原始資料及餘數)除以生成多項式 若能整除,代表資料無誤; 若無法整除,則代表傳送過程發生錯誤。 舉例來說,假設原始資料為1100, 生成多項式為X3+X1+1的係數為1011, 則傳送端會先運算右列module-2除法 (過程非減法,而是XOR運算), 取得餘數010。 CRC求餘數
94
循環冗餘碼(CRC) 然後傳送端會送出『原始資料』及『餘數』,也就是 。接收端於收到資料後,立刻進行除法,檢查是否整除如圖2-21,結果為0,代表傳送過程沒有發生錯誤。 生成多項式的長度(除數的位元數)必須視欲得到的CRC位元數來決定,目前常用的有CRC-8、CRC-12、CRC-16、CRC-32、CRC-CCITT等標準,代表不同的CRC位元數,通常CRC碼越長,則數據發生錯誤而不反應在 CRC碼的機率就越低,但傳送的資料將會越長,而降低資料交換的效率。 接收端檢查餘數是否為0
95
循環冗餘碼(CRC) 舉例來說,根據理論證明,CRC-16 可完全偵測資料區塊內一個或兩個位元的錯誤、奇數個位元的錯誤及最長連續16個位元的錯誤。並且根據統計,CRC-16對於超過17個連續位元的錯誤偵測率則有 %,其它位元長度的錯誤偵測率則可達 %。 CRC 多項式係數 CRC-8 CRC-10 CRC-12 : 各類CRC的生成多項式
96
2.10.3 錯誤修正碼(ECC) 同位位元及循環冗餘碼雖然可以檢查某些錯誤,但卻無法更正錯誤
(因為無法明確地知道是哪一個位元出現了錯誤),通常在查覺錯誤後,會要求發送端重新傳送一次。 但在某些傳送成本較高的場合時(例如衛星通訊),這樣的編碼就不足以應付。事實上,如果想要發展一套具有更正錯誤能力的錯誤修正碼(Error Correcting Codes),首先必須考慮它的漢明距離。 經由複雜的數學證明,對於錯誤修正碼的錯誤更正能力得到了下列公式: 對於上述公式而言,我們並不打算證明它,而是採用一個實例來說明它的原理。假設D=3,也就是我們設計一個漢明距離≧3的錯誤修正碼,則該修正碼可以偵測2個或1個位元的錯誤,並且可以自我修正1個位元錯誤。 若 ECC的漢明距離≧D 則 可以檢測出不超過D-1個位元的錯誤,並可以自我修正不超過(D-1)/2個錯誤。
97
錯誤修正碼(ECC) 所謂『漢明距離≧3的錯誤修正碼』,指的是該修正碼的每個位元圖樣之間的漢明距離皆≧3,例如下面這個範例就符合此項要求(具有知錯能改的能力)。 錯誤修正碼 字元 代碼 A 000000 B 010011 C 101001 D 100110 E 011100 F 001111 A B C D E F - 3 4 位元圖樣間的漢明距離
98
2.10.3 錯誤修正碼(ECC) 上述的錯誤修正碼,必須是傳送端與接收端皆認可的編碼機制。
當傳送端想要送出B字元(010011)時,在傳送過程中,最末位元發生了錯誤,使得接收端收到的是(010010)。此時,接收端按照原本的編碼機制對照之後,將會發現沒有任何一個字元符合此項代碼(這就是為何可以偵查1個或2個位元錯誤的關鍵,因為如果是更多位元的錯誤,就可能無法判斷是否發生錯誤),因此,將重新計算收到的資料與各代碼之間的漢明距離,如下表: 計算完畢之後,差距(漢明距離)最短的那一個字元,就是實際上原本傳送過來的正確資料,因此,接收端可以自動將(010010)修正為(010011),也就是字元B。 這也就是為何可以自我修正1個位元錯誤的關鍵,因為更多位元的錯誤,就可能無法判斷原本正確的代碼了。 A 000000 B 010011 C 101001 D 100110 E 011100 F 001111 010010 2 1 5 3 4
99
重點回顧 & 本章結束 Q&A討論時間
Similar presentations