第二章 數字系統:電腦內部的資料表示法 在第一章中,我們對於電腦有了初步的認識,在深入介紹電腦的各項組成元件之前,首先我們必須先了解另一種不同於人類使用習慣的二進位表示法,由於電腦的半導體、磁性、光學元件適合用來表示二進位,因此二進位表示法非常適合用來設計電腦。
第二章 數字系統:電腦內部的資料表示法 目前流行的電腦核心元件(例如中央處理器、主記憶體等等)皆由半導體材質製作而成,換句話說,電晶體(以半導體製作而成)是電腦核心元件的主要構成元素,而電晶體在電路中扮演著『開』與『關』的開關角色,因此,最適合以2進位來加以表示。想要更深一步了解電腦內部的運作模式,首先,我們必須先學習另外一套有別於10進位的數字系統,也就是2進位與16進位數字系統。
大綱 2.1 二進制及電腦的儲存單位 2.2 數字系統 2.3 轉換數字系統 2.4 正負數表示法 2.2.1 二進制數字系統 2.1 二進制及電腦的儲存單位 2.2 數字系統 2.2.1 二進制數字系統 2.2.2 十六進制數字系統 2.2.3 八進制數字系統 2.3 轉換數字系統 2.3.1 十進制轉二進制 2.3.2 十進制轉十六進制 2.3.3 十進制轉八進制 2.3.4 二進制、八進制與十六進制的轉換 2.4 正負數表示法 2.4.1 帶符號大小(signed-magnitude) 2.4.2 1's補數(1's complement) 2.4.3 2's補數(2's complement)
大綱 2.5 數值運算 2.6 邏輯運算 2.7 文字資料表示法 2.8 條碼 2.9 重點回顧 本章習題 2.5.1 加法 2.5 數值運算 2.5.1 加法 2.5.2 減法 2.5.3 乘法與除法 2.6 邏輯運算 2.7 文字資料表示法 2.7.1 ASCII碼 2.7.2 中文內碼 2.7.3 Unicode 2.8 條碼 2.9 重點回顧 本章習題
2.1 二進制及電腦的儲存單位 電腦使用的資料表示法與一般人所使用的資料表示法有很大的不同。 2.1 二進制及電腦的儲存單位 電腦使用的資料表示法與一般人所使用的資料表示法有很大的不同。 對於一般人來說,最常使用的是十進制、十二進制(例如一打)或六十進制(例如:時間)。十進位數(Decimal Digit)中每一個位數都有0~9等十種變化,每逢『十』就必須進位。 但實際上並非所有的現實狀況都會產生十種變化,對於某些現實狀況,採用二分法更能夠簡化問題,如圖中,我們可以用11001來表示五顆燈泡與五根水管的開關狀態。
2.1 二進制及電腦的儲存單位 電腦使用電子元件來儲存及運算資料,而這些電子元件通常只能夠顯示兩種狀態,即開(ON)或關(OFF),因此電腦使用的是二進位數(Binary Digit)來表示資料。 二進位的每一個位數稱之為位元(Bit)。可用來表示0或1的狀態,相對於電子元件的狀態,則可以將0視為關,1視為開。 位元(Bit)是記憶體的最小儲存單位,但只能夠產生2種變化(0與1),為了表達更多狀態的變化,因此必須組合多個位元。由於電腦硬體結構的定址緣故,因此,通常會將8個位元(Bits)組合成1個位元組(Byte),也就是1Byte=8 Bits,如此一來就可以產生28 =256種變化。 另一種計算存取資料的單位稱為字組(Word),一個Word究竟包含多少個Bytes,必須視硬體結構而定,一般說來,一個Word可能等於2個bytes(16位元電腦)、4個bytes(32位元電腦)、8個bytes(64位元電腦)。通常一個電腦所使用的Word長度越長時,代表一次可存取的資料長度越長,因此程式執行速度可能越快(仍必須視程式所使用的指令而定)。
2.1 二進制及電腦的儲存單位 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兆)
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進制做直覺性的轉換。 回顧日常生活所熟悉的十進制數字系統,我們可以推導出一個適合用任意數字系統的公式,然後再將此公式套用於不同的數字系統。 在十進位系統中,我們可以將一個數值分解為如下等式: 359.68 = 3*102+5*101+9*100+6*10-1+8*10-2
2.2 數字系統 觀察上述等式,我們可以發現,10為十進制的基底,因此,我們可以將基底由十進制擴充到K進制數字系統,一個K進制的正數N可以使用下列多項式來表達: 多項式中的每一位數(Di)我們稱之為位數(Digit),最左邊數字Dp-1稱為最高有效位數(Most Significant Digit;簡稱MSD)、最右邊數字D-q稱為最低有效位數(Least Significant Digit;簡稱LSD),並將基底K放在數值N的右下角標註,
2.2 數字系統 【範例】:307.25 = (307.25)10 之位數及加權計算 十進制(K=10)數字系統具有下列特性: 2.2 數字系統 十進制(K=10)數字系統具有下列特性: 每一位數能接受的數字符號為:0,1,2,3,4,5,6,7,8,9。 每一位數所代表的量,根據其位置而有不同的指數加權(底數為10)。 整數部份由小數點的左邊以10的正冪次方向左逐一遞增(次方由0開始)。 小數部份由小數點的右邊以10的負冪次方向右逐一遞減(次方由-1開始)。 10進制在做運算時,每一位數逢10向左進位。 【範例】:307.25 = (307.25)10 之位數及加權計算
2.2.1 二進制數字系統 半導體元件扮演的是一個類似『開關(switch)』的角色,當電壓足夠大時,開關就呈現開(ON)的現象;電壓不夠大時,開關就呈現關(OFF)的現象,因此可以從電壓分布的狀況來表示開與關兩種狀態,例如:+5V代表開、0V代表關。 電腦由於使用半導體製作而成,因此,電腦內部也是以0(關)、1(開)變化來表示資料。只有0、1變化的數字系統稱為2進制數字系統。通常為了與10進制的數值有所區別,我們會在數值右下角加上一個下標2,以示區隔。 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)
2.2.1 二進制數字系統 【範例】:1001.1012之位數及加權計算如下:
2.2.2 十六進制數字系統 由於使用二進制來表示數值,常常會出現一連串的0、1串列,例如:245就必須使用11110101來表示。這一連串的0、1串列,對一般人而言,非常不容易識別與記憶,因此為了提高數值的可讀性,通常採用8進制或16進制來表示記憶體內的資料。 至於為何不採用7進制或15進制呢?這則是由於8進制與16進制有非常簡單的對應規則,我們將在下一節中示範其轉換規則。 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。
2.2.2 十六進制數字系統 【範例】:6A416之位數及加權計算如下:
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進制數字。
2.2.3 八進制數字系統 【範例】:5728之位數及加權計算如下:
2.3 轉換數字系統 如果想要轉換為其他進制,例如將十進制轉換為二進制,則可以依照餘數法(remainder method)來進行轉換。 2.3 轉換數字系統 如果想要轉換為其他進制,例如將十進制轉換為二進制,則可以依照餘數法(remainder method)來進行轉換。 整數部份: 以原數值為被除數、目標進制的基底為除數進行除法,所得之餘數保留,然後以商與目標進制的基底為被除數及除數重複除法,直到無法再除(商數為0)為止。然後將所得之餘數反轉即可。 小數部份: 將(該數之小數部份)×(目標進制的基底),所得的整數部份保留,扣除整數部分繼續乘法,直到所指定的位數或為0時停止(若出現循環也必須停止)。所得整數部分連結即為欲轉換進制之小數部分。 【真實二進位與電腦使用二進位的差別】: 在轉換進制之前,我們必須先了解真實二進位與電腦使用二進位的差別,由於電腦的記憶體寬度有限,因此,必須使用寬度固定的二進位數字,例如當我們使用1個位元組(8個位元)來儲存二進位101011時,就必須在前面多餘的位數補上0,因此,該位元組的實際內容將會是00101011。
2.3.1 十進制轉二進制 【範例】:將38.37510轉換為2進制。 Step1:整數與小數部分需要分開處理。 2.3.1 十進制轉二進制 【範例】:將38.37510轉換為2進制。 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,3810=(100110)2=(00100110) 2 【若需補足1個位元組】。
2.3.1 十進制轉二進制 Step3:求出小數部分的轉換,0.37510=(0.011) 2。 2.3.1 十進制轉二進制 Step3:求出小數部分的轉換,0.37510=(0.011) 2。 Step4:合併整數與小數,38.37510=(100110.011) 2。
2.3.2 十進制轉十六進制 【範例】:將766.2812510轉換為16進制。 Step1:整數與小數部分需要分開處理。 2.3.2 十進制轉十六進制 【範例】:將766.2812510轉換為16進制。 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,76610=(2FE) 16=(02FE) 16 【若需補足2個位元組】。
2.3.2 十進制轉十六進制 Step3:求出小數部分的轉換,0.2812510=(0.48) 16。 2.3.2 十進制轉十六進制 Step3:求出小數部分的轉換,0.2812510=(0.48) 16。 Step4:合併整數與小數,766.2812510=(2FE.48) 16。
2.3.3 十進制轉八進制 【範例】:將766.2812510轉換為8進制。 Step1:整數與小數部分需要分開處理。 2.3.3 十進制轉八進制 【範例】:將766.2812510轉換為8進制。 Step1:整數與小數部分需要分開處理。 Step2:求出整數部分的轉換,76610=(1376)8。
2.3.3 十進制轉八進制 Step3:求出小數部分的轉換,0.2812510=(0.22)8。 2.3.3 十進制轉八進制 Step3:求出小數部分的轉換,0.2812510=(0.22)8。 Step4:合併整數與小數,766.2812510=(1376.22)8。
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 二進制與八進制對應表
2.3.4 二進制、八進制與十六進制的轉換 二進制 十六進制 十進制 0000 0001 1 0010 2 0011 3 0100 4 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 二進制與十六進制對應表
2.3.4 二進制、八進制與十六進制的轉換 【範例1】:將1011001010.11011012轉換16進制
2.3.4 二進制、八進制與十六進制的轉換 【範例2】:將1011001010.11011012轉換8進制。
2.3.4 二進制、八進制與十六進制的轉換 【範例3】:將3AB.516轉換2進制。
2.3.4 二進制、八進制與十六進制的轉換 【範例4】:將165.48轉換2進制。 【捷徑】: 16進制與10進制之轉換除了可以仿照2進制與10進制的轉換規則外,也可以先透過2進制做為中繼格式再行轉換,例如:16進制→2進制→10進制。8進制與10進制的轉換也同樣可以透過2進制做為中繼格式再行轉換。
2.4 正負數表示法 2.3節所介紹的二進位數值表示法,可以表達正整數,但對於負整數卻無法表達。為了讓電腦也可以表達負數,數學家發明了許多的數值表示法,並且很多都可以透過邏輯電路加以實作,三種最常見的正負數表示法分別如下 『帶符號大小』 『1's補數』 『2's補數』 這三種表示法都必須事先固定位元長度 現代電腦使用的是『2's補數』表示法。 三種表示法的對照表如下(其中2's補數的負數表示法為1's補數負數+1):
十進位 帶符號大小 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位元表示 正負整值的 三種表示法 對照表
2.4.1 帶符號大小(signed-magnitude) 帶符號大小的正負數表示法,顧名思義,就是有一個位元用來表示該數值為正數還是負數。這個位元通常位於最左邊。 使用n個位元來表達正負整數時,數值的表達範圍就只剩n-1個位元可以使用 所以正整數的表達範圍是+0~+(2n-1-1) 負整數的表達範圍是-(2n-1-1)~-0 明顯地,對於0而言,使用帶符號大小表示0的時候,+0與-0是不一樣的。 以8位元來表示正負整數時,若採用帶符號大小來表示,方法則如下所列: 8位元的帶符號表示法
2.4.2 1's補數(1's complement) 1's補數(1's complement)和帶符號表示法的原理不太相同,在1's補數中,如果要表達負數,則必須先求得正整數,然後再將每個位元加以反相(inverse),就可以得到負整數了,所謂反相,其實就是將該位元由1變0或由0變1,如下圖範例: 在上圖中,我們可以很明顯看到,1's補數的轉換機制是可逆的,換句話說,當您看到一個負的1's補數二進位數字時,如果想要知道該數值代表多少,同樣可以透過反相求出該負整數的絕對值。 1's補數的正負轉換
2.4.3 2's補數(2's complement) 2's補數(2's complement)是一個最完美的正負二進位整數的表示法,它是基於1's補數演變而來(同樣必須限制表示的位元寬度),也就是當我們要將一個二進位整數變號時,只需要先將其1's補數求出,然後再加1,就可以得到2's補數了,如下圖所示: 2's補數的正負轉換
2.4.3 2's補數(2's complement) 在上圖中,我們可以很明顯看到,其實2's補數的轉換機制對於『正整數轉負整數』或『負整數轉正整數』所使用的方法都是一樣的,例如,當您看到2's補數二進位負整數110010112時,也可以先將其反相(使用1's補數的方法),然後再加1,就可以得到該負整數的絕對值了。 2's補數是現今大多數電腦內部的邏輯電路所採用的整數表示法,因為它具有下列特點: +0與-0的表示法相同。以8個位元來加以表示+0與-0,都是000000002 。 可以透過最左邊的位元快速判定該數為正整數或負整數。(最左邊位元為0,一定是正整數或0)。 負整數的表達範圍更大,它可以表達的整數範圍是 +(2n-1-1) ~ -2n-1 (位元寬度為n時)。而-2n-1的表示法就是1000…0002 。 可以輕易地使用邏輯電路實作加/減法器,並且正負數轉換機制相同,因此不必額外設計一套電路。
2.4.3 2's補數(2's complement) 帶符號大小 1's補數 2's補數 採用 非個人電腦採用 個人電腦採用 優點 1.最左邊位元可判定正負數。 2.對人來說非常簡單,容易理解。 2.轉換機制是可逆的。 3.可以透過邏輯電路輕鬆設計完成反相。 2.+0與-0表示法相同。 3.表達範圍是 +(2n-1-1) ~ -2n-1。 4.轉換機制是可逆的。 5.可以輕易地使用邏輯電路實作相關應用電路。 缺點 1.+0與-0的表示不同。 2.不容易使用邏輯電路實作相關應用電路。 3.表達範圍是 +0~+(2n-1-1)、 -(2n-1-1)~-0。 4.+0與-0表示方式不同。 1.必須限制表示的位元數。 2.表達範圍是 +0~+(2n-1-1)、 -(2n-1-1)~-0。 3.+0與-0表示方式不同。 1. 必須限制表示的位元數
2.5 數值運算 二進位數字的數值運算和十進位非常相近,在本節中,我們將以正整數為例,介紹二進位數字的四則運算。 2.5 數值運算 二進位數字的數值運算和十進位非常相近,在本節中,我們將以正整數為例,介紹二進位數字的四則運算。 對於純數學的二進位正整數的四則運算而言,並不會規定位元長度範圍,但由於實際設計電路的關係,我們必須強制規定運算來源與運算結果的位元長度,當超過表示範圍時,則會發生溢位現象。
2.5.1 加法 假設我們要做1010110與100011的加法,並使用8個位元來存放被加數與加數,結果則以8位元加以存放,則加法步驟如下(與10進位加法沒有太大差別,只要把握逢2進位原則即可): Step1:被加數與加數的不足位數部分先補0。 如同右圖的直式加法。 Step2:由右至左,使用如下公式進行加法。 右圖是右邊倒數第二位加法遇到進位時的狀況。 被加數 + 加數 = 結果 1 0,但進位1
2.5.1 加法 Step3:當考慮由前面位元加法所得的進位狀況時,則將公式修改為下表繼續運算: 2.5.1 加法 Step3:當考慮由前面位元加法所得的進位狀況時,則將公式修改為下表繼續運算: Step4:不斷的由右至左進行上述加法,最後可以得到右圖結果。所以相加結果為1111001。 進位 + 被加數 加數 = 結果 1 1 (不必進位) 0,但進位1 1,但進位1
2.5.1 加法 【溢位】: 溢位(overflow)是二進位邏輯電路在計算加法或減法時可能會出現的一種現象,由於使用邏輯電路表達二進位資料時,必須限制位元長度,因此,當相加或相減的結果超過表達範圍時,就發生了溢位現象。 舉例來說,當使用8個位元表達二進位數字時(使用2's補數)可表達的範圍是 -128~+127。因此,當+127+1(也就是011111112+12)時,將會得到100000002,而100000002是-128,而不是+128(因為+128已經超過表達範圍),此時就發生溢位現象。 通常我們可以依據下列原則判斷是否發生溢位現象: 當運算結果超出表達範圍。 正負符號出現異常狀況,例如:正整數+正整數的答案應該也是正整數,而運算結果的左邊第一位元顯示為負數時(也就是正負符號為1),就代表發生了溢位現象。 使用XOR判斷法,XOR為一種互斥運算。
2.5.2 減法 除了使用加法來實踐減法之外,我們也可以使用過去十進位減法的方式來計算二進位減法,如下範例: 2.5.2 減法 減法其實只是加法的延伸,我們可以把減數取負數變成加數,就可以使用加法原理來加以計算,例如:X-Y=X+(-Y)。 如果要把二進位減法使用加法來實踐,我們必須使用2's補數來表達負數,而且結果可能會出現超過位元長度的現象,此時只要將多出的位元去除即可,如下範例: 除了使用加法來實踐減法之外,我們也可以使用過去十進位減法的方式來計算二進位減法,如下範例:
2.5.2 減法 Step1:被減數與減數的不足位數部分先補0。如同右圖的直式減法。 2.5.2 減法 Step1:被減數與減數的不足位數部分先補0。如同右圖的直式減法。 Step2:由右至左,使用如下公式進行減法。右圖是遇到需要借位時的狀況。 被減數 - 減數 = 結果 1 1,但需借位
2.5.2 減法 Step3:當考慮由前面位元減法所得的借位狀況時,則將公式修改為下表繼續運算: 2.5.2 減法 Step3:當考慮由前面位元減法所得的借位狀況時,則將公式修改為下表繼續運算: Step4:不斷的由右至左進行上述減法,最後可以得到右圖結果。所以相減結果為11010。 借位 + 被減數 - 減數 = 結果 -1 1,但需借位 1 0,但需借位 0 (不需借位)
2.5.3 乘法與除法 二進位乘法與除法與過去的十進位乘除法觀念大同小異,如下範例: 2.5.3 乘法與除法 二進位乘法與除法與過去的十進位乘除法觀念大同小異,如下範例: 通常邏輯電路計算二進位正整數乘除法時,必須考慮以下事項: 若被乘數與乘數使用n個位元表達時,則乘積必須使用2n的位元長度來表達。 若執行除法時,必須將結果的商與餘數分開存放。
2.6 邏輯運算 由於二進位數只有0與1兩種數值,因此恰好可以用來表示真(True)與假(False)兩種邏輯狀態。 2.6 邏輯運算 由於二進位數只有0與1兩種數值,因此恰好可以用來表示真(True)與假(False)兩種邏輯狀態。 『真與假』就像『是與否』,可以決定某一事實是否成立,例如日常生活中,我們會問「你吃過飯了嗎?」,答案非『是』即『否』。 對於電腦而言,二分法是最基本的分類方法,對於比較複雜的狀況,我們則可以透過邏輯運算子(logical operator)將各類狀況加以組合。 專門用來進行只有0與1的邏輯運算函數稱之為布林函數(Boolean Function),其定義域與對應域都只有0與1兩種狀況,也就是真或假。 通常我們會透過真值表(Truth Table)來表現布林函數所有變數與函數值之間的對應關係。 以下,我們將透過真值表來介紹各類邏輯運算子,每一個邏輯運算子都可以視為一個基本的布林函數,而其運算變數則稱之為運算元(operand)。
2.6 邏輯運算 AND: AND可以用來表示『且』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 2.6 邏輯運算 AND: AND可以用來表示『且』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,只有在兩個輸入運算元同時為1時,才會輸出1。 AND的代表符號為『.』或『*』或根本簡略不寫。所以AND的布林函數F(X,Y)=X.Y或F(X,Y)=X*Y或F(X,Y)=XY。 真值表: X AND Y X Y X AND Y 1
2.6 邏輯運算 OR: OR可以用來表示『或』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 2.6 邏輯運算 OR: OR可以用來表示『或』,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,只要兩個輸入運算元的其中有一個為1時,就會輸出1。 OR的代表符號為『+』。所以OR的布林函數F(X,Y)=X+Y。 真值表: X OR Y X Y X OR Y 1
2.6 邏輯運算 NOT: NOT可以用來取補數,是單元運算子,接受一個輸入運算元,並產生一個輸出。 2.6 邏輯運算 NOT: NOT可以用來取補數,是單元運算子,接受一個輸入運算元,並產生一個輸出。 真值表如下,若輸入為1則輸出為0,若輸入為0則輸出為1。 NOT的代表符號為『'』、『﹁』、『~』或『 ̄』。所以NOT的布林函數F(X)=X'或F(X)=~X或F(X)= ﹁X或F(X)= 真值表:NOT X X NOT X 1
2.6 邏輯運算 XOR: XOR稱為互斥或(exclusive OR)運算,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 2.6 邏輯運算 XOR: XOR稱為互斥或(exclusive OR)運算,是一個二元運算子,接受兩個輸入運算元,並產生一個輸出。 真值表如下,當兩個輸入運算元的值不同時,才會輸出"1",否則輸出"0"(當兩個輸入訊號相同時)。 通常XOR邏輯運算符號為"XOR"或"⊕"。所以XOR的布林函數F(X,Y)=X⊕Y。 真值表: X XOR Y X Y X XOR Y 1
2.6 邏輯運算 【範例】: 假設布林函數F(X,Y,Z)=X'YZ+(X'Y)(Y+Z')+(X'+Z')', 請問F(1,0,1)=? 2.6 邏輯運算 【範例】: 假設布林函數F(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)' = 0 * 0 * 1 + ( 0 ) * ( 0 ) + (0)' = 0 + 0 + 1 = 1
2.7 文字資料表示法 前面章節介紹了數值資料在電腦的存放方式,而文字資料又是如何被放到記憶體的呢?由於每一個記憶體單元只能接受0、1等2進制的表示法,因此文字資料必須先經由編碼,使得不同的字元對應到唯一的位元圖樣(bit pattern),然後才能存入記憶體中。目前最普遍的編碼為ASCII,繁體中文則為Big5碼。此外,為了統一各國文字的編碼方式,另外也發展了Unicode編碼方式。 2.7.1 ASCII碼 ASCII碼(American Standard Code for Information Interchange,唸做as-key)為美國國家標準局所制定的一種編碼方式,目的是提供一個各類電腦皆通用的編碼方式以便於使得這些電腦可以互通訊息。 ASCII碼為7個bits,因此可以產生128種變化,每一個變化都可以用來表示一個特殊字符,其中的95個字符為可列印字符,而剩餘的字符則為不可列印的特殊控制字符,例如:換列、倒退鍵、歸位等。詳細的ASCII表如下:
00 NULL 1 01 SOH 2 02 STX 3 03 ETX 4 04 EOT 5 05 ENQ 6 06 ACK 7 07 BEL 十進位 十六進位 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 :
2.7.1 ASCII碼 由於1個Bytes為8個Bits,因此留下剩餘的1個Bit並無任何作用,有時將該位元用來記錄同位檢查,或者將ASCII擴充為8個Bits,稱之為ASCII-8,可以產生256種變化。 ASCII的應用實例非常多,例如您在個人電腦的鍵盤按下一個『H』鍵,它將會被轉換為4816,就是ASCII碼的01001000,然後再存入記憶體中。 雖然ASCII是目前最普遍的編碼系統,但並非所有的系統都採用這種編碼方式,例如IBM機器(非IBM PC)則採用8位元碼EBCDIC(Extended Binary Coded Decimal Interchange Code)或ASCII-9,以便表達較多的字元變化。 【同位位元檢查】 同位位元檢查(parity bit check)是一種偵測錯誤的技術,在送出資料之前,先加上一個同位位元(一般會加在前面),然後才將資料傳送出去,接收端於收到資料後,會檢查每個位元一共包含奇數個1或偶數個1,以便判斷傳輸過程中,是否發生錯誤。 因此,同位位元檢查又可以分為奇同位檢查(odd parity check)與偶同位檢查(even parity check)。顧名思義,奇同位檢查的資料位元與同位位元合計一共應該有奇數個1;偶同位檢查的資料位元與同位位元合計一共應該有偶數個1,若接收端發現資料不符合此項規則,則代表資料在傳輸過程中發生了錯誤。(但並非符合規則就是沒有錯誤)
2.7.1 ASCII碼 假設,我們採用奇同位檢查,傳送大寫英文字母Q與U,其ASCII碼分別為1010001(Q)與1010101(U),在傳送資料之前,必須先將同位位元加在前面,也就是01010001(Q)與11010101(U),使得位元圖樣共有奇數個1,如下圖所示。 對於接收端而言,當它收到01010001與11010101資料時,會先檢查是否每一筆位元圖樣都恰好有奇數個1,如果確實如此,則視為正確,便將同位位元去除,取出原始資料1010001(Q)與1010101(U);如果發現位元圖樣出現偶數個1,則視為資料錯誤,此時可以要求重新再送一次資料,或產生錯誤訊息。 奇同位檢查
2.7.1 ASCII碼 奇同位檢查運作流程 使用同位檢查技術,對於所有的奇數個位元的錯誤而言,一定可以被檢測出來;但偶數個(兩個、四個‥‥)位元同時發生錯誤時,將無法發現錯誤。 由於同位位元只會使得原本的資料長度多一個位元(甚至不會浪費位元數,例如可以善用ASCII多餘的一個位元來當作同位位元),所以並不會太佔用空間。況且,由於硬體實作或軟體實作只需要使用XOR與NOT兩種邏輯運算即可實現同位檢查,因此雖然無法找出所有的錯誤,但同位檢查技術仍舊被許多應用所採用。
2.7.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碼請至http://input.cpatch.org/code/big5.zip下載)
2.7.2 中文內碼 部分BIG5字元表-1 內碼 字符 A140 A141 , A142 、 A143 。 A144 . A145 ‧ 2.7.2 中文內碼 內碼 字符 A140 A141 , A142 、 A143 。 A144 . A145 ‧ A146 ; A147 : A148 ? A149 ! A14A ︰ A14B … A14C ‥ A14D ﹐ A14E ﹑ A14F ﹒ A150 · A151 ﹔ A152 ﹕ A153 ﹖ A154 ﹗ A155 | A156 - A157 ︱ A158 A159 ︳ A15A ╴ A15B ︴ A15C ﹏ A15D ( A15E ) A15F ︵ A160 ︶ A161 { A162 } A163 ︷ A164 ︸ A165 〔 A166 〕 A167 ︹ A168 ︺ A169 【 A16A 】 A16B ︻ A16C ︼ A16D 《 A16E 》 A16F ︽ A170 ︾ A171 〈 A172 〉 A173 ︿ A174 ﹀ A175 「 A176 」 A177 ﹁ A178 ﹂ A179 『 A17A 』 A17B ﹃ A17C ﹄ A17D ﹙ A17E ﹚ A1A1 ﹛ A1A2 ﹜ 部分BIG5字元表-1
2.7.2 中文內碼 部分BIG5字元表-2 內碼 字符 B140 莆 B141 莧 B142 處 B143 彪 B144 蛇 B145 蛀 2.7.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字元表-2
2.7.2 中文內碼 【深入探討Big5】 Big5碼使用兩個位元組來存放資料,而ASCII使用一個位元組來存放資料,假設我們的文章中出現中英混雜的狀況時(例如:『m乘n 』),電腦是如何判斷哪些是中文字,哪些又是英文字母呢? 為了解決這個問題,Big5的第一個位元組規定一定要比127還要大,如此使用Big5內碼的電腦發現第一個位元組超過127時,就可以判定為中文。 例如:『m乘n 』實際上的資料應該是『6DADBC6E』,電腦預定每次讀取一個位元組,當讀到『6D』時,發現比7F還要小,所以直接輸出『m』;當讀到『AD』時,發現比7F還要大,所以必須再讀取一個位元組『BC』,組成Big5碼『ADBC』後,透過查表對應到『乘』,然後才輸出『乘』;最後又讀取一個位元組,讀到『6E』,發現比7F還要小,所以直接輸出『n』,而成為我們看到的『m乘n 』。 事實上,128(即A016)也不會出現在Big5碼的第一個位元組,Big5碼的第一個位元組只可能出現(A116 - F916)的數值,同時也不是每一個數值都對應了中文字元(只有其中的3+35+49=87個數值有用),關於Big5的第一個位元組規定如下:
2.7.2 中文內碼 分類區 範圍 統計 符號區 A1 - A3 3 sectors 常用字區 A4 - C6 35 sectors 未定義區 C7 - C8 2 sectors 次常用字區 C9 - F9 49 sectors Big5的第一個位元組 至於Big5的第二個位元組則介於4016 - FE16,並且也不是全部都有用到(只有其中的63+94=157個數值有用),關於Big5的第二個位元組規定如下: 分類區 範圍 統計 第一部份 40 - 7E 63 codes 未定義區 7F - A0 34 codes 第二部分 A1 - FE 94 codes Big5的第二個位元組
2.7.2 中文內碼 所以Big5共定義了87*157=13659個中文字。光是這些中文字夠用嗎? 2.7.2 中文內碼 所以Big5共定義了87*157=13659個中文字。光是這些中文字夠用嗎? 答案當然是不夠的,話說BIG5之所以叫BIG5,是因為該碼是在1984年由台灣五家電腦公司共同推動,事實上,在這之前,國字整理小組已經整理出七萬多個中文字,而BIG5只能容納一萬三千多個中文字,所以根本不夠用,而且連五家電腦公司之一的宏碁的「碁」都打不出來,更不用說,打不出游錫「堃」等字。 由於Big5不夠使用,因此後來又出現了一些改良版,如BIG5_Eten、BIG5-HKSCS、BIG-5E及BIG5_unicode等等,而原本的Big5碼則稱為BIG5_1984。 由於版本如此之多,因此也使得軟體支援Big5碼出現不統一的現象。而面對這個問題,大家似乎不想直接在Big5方面著手解決,而期望未來採用Unicode碼加以解決。
2.7.3 Unicode 除了中文問題之外,事實上許多非英語系國家也面臨文字數量過多的問題,因此,為了統一解決這些問題,又發展了另一套編碼系統,稱之為Unicode。 Unicode是依據ISO/IEC 10646標準所制定的一套通行全球的編碼系統,Unicode使用2個位元組來表示字元符號,因此可以產生65536個字元,其中最前面的128個字元與ASCII相同。使用Unicode將可以讓電腦處理目前人類所遭遇的所有語系文字,例如:英文、中文、日文、法文、拉丁文‥‥等等,而不需要為各種不同語系設計不同的編碼系統,因此在網際網路中,尤其容易見到。
2.7.3 Unicode Unicode的優點 由於網際網路的發達,因此,跨國性的文件常常會被採用,例如:我們很可能會到大陸網站找尋資料。由於台灣使用的字集是繁體中文字集Big5,而大陸則使用簡體中文字集GB2312,因此,若使用繁體的瀏覽器閱讀簡體網頁時,會發生衝碼現象,也就是可能會出現一些亂碼和部分的繁體中文,這是由於簡體中文內碼恰好對應到某個繁體中文的內碼。 而瀏覽網頁發生衝碼現象,主要則是由於該網頁採用各國自行使用的內碼所致,若使用Unicode進行編碼的話,就不會發生這種現象,因為Unicode已經將各國編碼系統打亂,重新制定為單一的編碼系統。並且大多數的瀏覽器都已經支援了Unicode字集,以便顯示包含各國文字的網頁。
2.7.3 Unicode UTF-16與UTF-8 Unicode使用16位元進行各國文字的編碼,這種格式稱之為UTF-16。但是對於某些全部都是英文的文件而言,使用UTF-16的16個位元存放英文字母,顯得有些浪費,因此Unicode提供了另一種UTF-8的儲存格式。 UFT-8的編碼長度並不是固定的8個位元,而是一種可變動式的編碼長度,例如,英文會以8個位元來儲存,但中文就會以24個位元來儲存,因此,如果是中文字出現頻率較高的文件,使用UTF-16格式儲存會比UTF-8來得節省空間。
2.8 條碼 在日常生活中,我們可以發現到許多商品上面都有條碼(Bar Codes;barcode),條碼是利用粗細不等的線條所組成,至少可以用來表示0~9等十進位數字,並且可以透過光學條碼掃描機(bar code reader),將資料輸入電腦之中 由於條碼不具方向性,對於商品資料的快速輸入,有很大的幫助,因此條碼目前已經成為商品資料表示法的主流。 條碼 使用條碼掃描機
重點回顧 本章習題