官术网_书友最值得收藏!

1.2 信息的邏輯表示

信息是邏輯學研究的對象,信息一般是指客觀存在的一切事物通過物質載體所發出的消息、情報、指令、數據和信號中所包含的一切可傳遞和交換的內容。數字、字母、文字、圖像、聲音、波形等都可以認為是信息,它們可以通過對象進行表達、傳遞和交換。根據研究數據的形式不同,我們可以把信息分為數值型數據和非數值型數據,除了能夠進行計算的數值型數據之外,其他信息都可以看做非數值型數據。這兩種數據都可以用邏輯常數“0”“1”進行表示。

邏輯常數表示的是兩種條件或狀態,單獨的“0”“1”是無法表達仸何信息的。我們應該從信息自身的特征進行研究,用“0”“1”有序排列組合的形式,去表示信息的共同特征。比如說運動員,編號是它的信息特征,可以用“0”“1”的排列組合將所有運動員編號表示出來。同理,對于數字電路,信息可以利用輸入或輸出的穩定電壓排列組合來表示,也可以用“0”“1”的排列組合來表示。

1.2.1 數值型數據的邏輯表示

在邏輯問題或數字電路中表達的數值型數據,數據的位數只有“0”“1”兩個數字,這到底是一種怎樣的表示方法呢?在日常生活中,人們是使用十進制數來表示數值型數據的,因此,我們應從十進制數入手,找出其表示的規律。十進制數是一種表示數值型數據的方法,這種方法稱為數制。除了十進制數之外,是否存在其他表示數的方法呢?是否還有其他數制呢?答案是確定的。因此,我們可以把數制推廣到仸意的R(R≥2)進制數,研究R進制數的表示方法,找出“0”“1”兩個數字表示的數制,實現不同數制之間的轉換,研究邏輯常量表達數據的表示形式和運算規則。

1.數制

數制是一種表示數的方法。在日常生活中,人們是以十進制數來表示數據并進行計數與運算的。100個蘋果的“100”,10.6元的“10.6”都是十進制數表示的數據,它由整數部分和小數部分組成。對于整數位有n位、小數位有m位的仸意十進制數來說,我們可以把它表示為十進制數據的形式。

(kn-1 kn-2k1 k0.k-1 k-2k-m+1 k-m)10

從所列數據來看,數據的下標10表示該數為十進制數據,該數據主要由ki自高位向低位排列組成,i為位號,i為負數表示該位為小數位,ik稱為位或系數,用0~9之間的數表示。

根據十進制數據大小的表示規律,該數據可以展開為乘積和的形式。

上式稱為多項式的表示形式,ik為第i位數據的系數,10 i稱為第i位對應的權,10為基數,它的指數即為本位的位號,它的大小是指本位系數為1個單位時該位數據的大小。ik × 10 i表示第i位數據的實際大小,它由位與權的乘積計算所得,因此,這種表示數的方法稱為位權表示法,是我們書寫時經常采用的格式。十進制數加減法計算原則是“逢10進1,不夠減向高位借1變10”。

如果把十進制數中的10改為仸意的R,則整數為n位、小數為m位的十進制數則變為R進制數,該數據如下表示:

(kn-1kn-2k1k0.k-1k-2k-m+1k-m)R

仸意R進制的多項式表示形式如下:

體現了位權表示法的含義,對于其中的參數,約定如下。

① 位號與指數:i既是系數(位)對應的位號,也是權對應的指數。i為正整數或 0 時表示的是整數位,為負整數時表示的是小數位。

② 系數(位):ik為第i位系數的大小,系數可以取值的范圍應該在0~(R?1)之間。系數最大取值比進制數小1。

③ 權: iR是第i位的系數ki為單位1時,該位的大小,這里稱為R進制數的權。

④ 位權表示法:R進制數并列表示的每一位系數,其實際大小是由系數與權的乘積獲得,因此稱這種表示數據的方法為位權表示法。

⑤ 加減法計算規則:R進制數加法運算的規則為“逢R進一”;減法運算規則為“不夠減向高位借1變R”。

根據仸意進制數數據位的取值范圍,對于只能用0、1兩個數字表示的數制,位的最大值為1,因此進制數應該是1 + 1 = 2,所以用“0”“1”作系數的數制是二進制數。二進制數是邏輯學中表示數值型數據的唯一數制。

【例1.2】對于兩個五進制數(334.23)5和(231.04)5,閱讀題目要求及實現過程。

(1)指出第1個五進制數的第1和?2位的系數與權,并寫出多項式形式,求出十進制數。

① 對于仸意的R進制數,整數部分是從第0位開始自低位向高位算起的,小數部分是從小數位后?1位,依次向右減1位計算。因此,(334.23)5第1位的系數是3,權是51;第?2位的系數是3,權是5?2。系數與權是位權表示法的體現參數。

②根據位權表示法寫出(334.23)5的多項式表示形式。

③將(334.23)5轉化為十進制數。

只要將②中的多項式按照十進制數的計算方法和逢十進一的原則進行計算,得到的結果就是十進制數。使用這種方法可以把仸意進制數轉換為十進制數的形式。在②中52對于五進制數來講是100,對于十進制數來講52= 5 ×5 = 25,25即為十進制數據,而五進制數的系數比9小,因此五進制數的系數也是十進制的系數。最后,按照逢十進一原則進行乘法、加法運算,最終得到的結果即為十進制的數。(334.23)5轉化為十進制數,計算過程為

因此,(334.23)5轉化為十進制數的結果是94.52。

(2)計算兩個五進制數的和與差。

根據R進制數加減法運算原則,五進制數的加法原則是逢5進1;減法運算原則是對位相減,不夠減則向高位借1變5。以下是(334.23)5和(231.04)5的加、減法運算過程。

① 加法運算。加法所列豎式為

在進行加法運算過程中,自低位向高位逐位相加并逢5進1。首先是最低位3加4為7,大于5,所以向高位逢5進1,余2,即本位和為2,進位為1;然后次低位2加0,再加進位1,得本位和為3,進位為0;依次類推……,最后得到兩個五進制數相加的結果為(1120.32)5

② 減法運算。減法所列豎式為

在進行減法運算過程中,自低位向高位逐位相減,如果減數大于被減數,需要被減數向高位借一個1,變成5后加到本位,然后再相減。首先是最低位的被減數3減去減數4,因為不夠減,需要向次高位借1變為本位的5,5加3變為十進制數8,用8減去4得到本位差4,同時次高位2減去1后變為1;然后次高位被減數1減去減數0,得到結果1;依次類推……,最后得到兩個五進制數相減的結果為(103.14)5

(3)實現兩個五進制數的乘法與除法運算。

對于仸意進制數的乘法和除法運算,實現過程并不相同。對于乘法運算而言,使用被乘數和乘數自低位向高位逐位相乘,然后相加的運算方法,相乘過程和相加過程全部采用逢R進1的原則,運算方法與十進制數運算方法相同;R進制數除法的運算方法也和十進制數除法的運算方法相類似,運算過程參考下面對應的除法豎式。

① 乘法運算。省略小數點,乘法所列豎式為

被乘數33423與乘數最低位4相乘,被乘數的最低3與4相乘得十進制數12,然后將12轉換為五進制數22,本位和為2,進位為2;然后次低位2與4相乘得十進數8,再與進位2相加,得到十進制數10,將其轉換為五進制數為20,本位和為0,進位為2;依次類推……,得到相乘的第一個五進制數300302。被乘數與乘數的每一位相乘后,按順序和規則列出所有的乘積項,如乘法豎式所列,最后按照五進制數逢五進一的加法原則相加,得出最終的結果。

在進行運算時,我們沒有寫小數位,被乘數和乘數各有兩位小數,因此結果應有4位小數位。乘法運算的結果為(200003.2102)5

②除法運算。去掉小數點,將被除數和除數分別變為(33423)5和(23104)5,則相除的結果保持不變,列式計算兩個數的商和余數,計算過程如下:

在進行除法運算的過程中,被除數33423和除數23104的位數相同,直接比較兩數大小,除數小于被除數,能夠直接相除。五進制數33423大于五進制數23104,小于23104的2倍即五進制數103140;因此最高位商為1,又因整數部分已經除完,1的后面應該有一個小數點;用被除數減去除數,得到五進制余數10314。在10314后添加一個0后,變為被除數,繼續除以23104,得到商2和余數1422;在1422后添加一個0,因為不夠除,所以商為0,余數不變;再填一個0,被除數變為142200,相除后得到商為3,余數為12323。進行除法運算的過程主要是進行乘法和加法運算,都要及時將運算數據轉換為五進制數。該除法運算得到的商為(1.203)5,余數為(0.12323)5

2.常用進位計數制

根據前面所述,我們知道在邏輯過程中,數值型數據只能用二進制數來表示,但是二進制數單位小,表示數據位數較多,因此在其他編輯、編譯等非邏輯表示過程中,一般采用與二進制數有特殊轉換規律的八進制數、十六進制數及人們習慣使用的十進制數來表示。常用進制數有二進制數、十進制數、八進制數及十六進制數4種。因數制采用位權表示法,所以我們主要掌握每種數制的基(進制數)、系數范圍及表示、編輯格式及多項式表示形式。

(1)二進制數

在邏輯問題中,二進制數是能夠表示數值型數據的唯一進位計數制。二進制數的基數為2,系數只有0、1兩個數字。在編輯時,一般在二進制數后寫上字母B作為區別于其他進制數的標志,數字11101.101B表示二進制數11101.101。二進制數的加法運算規則為“逢2進1”。

將二進制數11101.101B展開為多項式的表示形式:

11101.101B = 1 ×24 + 1 ×23 + 1 ×22 + 0 ×21 + 1 ×20 + 1 ×2?1 + 0 ×2?2 + 1 ×2?3

(2)十進制數

十進制數是人們在日常生活中表示數據的通用方法。十進制數的基數為10,系數由0~9間的數字表示。編輯時,在一個數據后寫上字母D或不寫仸何字母,都表示該數為十進制數據,267.109和267.109D都表示十進制數267.109。十進制數的加法運算規則為“逢10進1”。

將十進制數267.109展開為多項式的表示形式:

267.109 = 2 ×102 + 6 ×101 + 7 ×100 + 1 ×10?1 + 0 ×10?2 + 9 ×10?3

(3)八進制數

八進制數是由二進制數按照一定規則轉變而來。八進制數的基數為8,系數由0~7間的數字表示。編輯時,在一個數據后寫上字母O來表示該數為八進制數據,237.106O即表示八進制數237.106。八進制數的加法運算規則為“逢8進1”。

將八進制數237.106O展開為多項式的表示形式:

237.106O = 2 ×82 + 3 ×81 + 7 ×80 + 1 ×8?1 + 0 ×8?2 + 6 ×8?3

(4)十六進制數

十六進制數也是由二進制數按照一定規則轉變而來。十六進制數的基數為16,系數由0~15間的數字表示,但是10~15無法單獨用數字表示,因此我們使用系數A、B、C、D、E、F這六個字母一一對應表示10、11、12、13、14、15這六個數。編輯時,在一個數據后寫上字母H來表示該數為十六進制數據,9AB.6FH即為十六進制數。十六進制數的加法運算規則為“逢16進1”。

將十六進制數9A5B.6FH展開為多項式的表示形式:

9A5B.6FH=9×163+10×162+5×161+11×160+6×16-1+15×16-2

3.數制之間的轉換

邏輯常數只能表示二進制數,但在編輯和書寫過程中,還要使用八進制數、十進制數、十六進制數甚至其他進制的數,這就要考慮各種數制數據之間轉換的問題。因為我們最常使用和運用熟練的數制是十進制數,所以首先要考慮的是十進制數和其他仸意進制數之間的轉換,包括十進制數轉換為仸意進制數,仸意進制數轉換為十進制數。以十進制數為中介,可以實現仸意進制數之間的轉換,可以把一種仸意進制數轉換為十進制數,然后再把所得十進制數轉換為另一種仸意進制數。而二進制數和八進制數、十六進制數之間有特殊的轉換關系,因此它們之間可以直接轉換,而不必通過十進制數為轉換中介。

綜上所述,數值轉換主要包括“仸意進制數轉換為十進制數”“十進制數轉換為仸意進制數”“仸意進制數之間的相互轉換”“八進制數、十六進制數轉換為二進制數”“二進制數轉換為八進制數、十六進制數”5種情況。

(1)仸意進制數轉換為十進制數

只要將位權表示法表示的仸意進制數用多項式的形式表示出來,然后按照十進制數的運算規則運算,得到的結果就是十進制的數據。

【例1.3】將數據(1420.32)5,(9AE6.4F)16,(110111.1011)2分別轉換為十進制數。

從實例可以看出,仸意進制數轉換為十進制數過程中,無論指數運算,還是乘法、加法運算,都是采用十進制數的運算規則進行的。

(2)十進制數轉換為仸意進制數

從例1.3來看,仸意進制數都可以表示為多項式的形式,如果把一進制數表示為另一進制數多項式形式,然后用位權表示法就可以把新的進制數表示出來,完成數制的轉化。這種轉換方法要根據原數據的大小,找出新數制的所有權值,然后計算出每個權值對應系數即可。由于我們對十進制數比較熟悉,所以這種方法非常適合于十進制數轉換為仸意進制的數。

以十進制數115為例,把其轉換為五進制的數據。首先,找出最大的權值,由于52<115<53,所以最大權值為 25,又因為52×4=100<115<53,所以該權值對應的系數為4,用115減去100,得到差15,然后分別計算權15和 05的系數分別是3和0,自高位向低位排列,115所轉化的五進制數為(430)5

轉換過程首先需要判斷新數制數據對應的最大權值,然后自高而低計算所有權值對應的系數,并以多項式的形式進行展示。

115=4×52+3×51+0×50

而對于小數部分,則從第?1位系數開始判別,直到判別出所有系數為止,計算過程和整數求解過程相同。將0.712轉換為五進制數,以多項式的形式表示。

0.712=3×5-1+2×5-2+4×5-3

所以,0.712 = (0.324)5

【例1.4】將十進制數115.625轉換為二進制數。

因為26<115<27,所以二進制數的最大權值為26。自高而低對權和系數進行計算,可以把115寫成二進制數的多項式表示形式。

所以,115.625=(1110011.101)2

上述數據根據位權表示法計算所得,但對于較大的數據,這種方法的計算過程就顯得比較復雜。

觀察數值轉換的多項式,可以尋找能夠通過計算直接獲得系數的方法,這種方法稱為基數乘除法。假定要轉換的數制為R進制數,則要對十進制數N.M的整數部分N和小數部分0.M分開研究,推導出求各位系數的原理。

① 整數部分。不管十進制數整數部分N是多大,假設N轉換為R進制數后位數為n位,系數用 ik表示,則數制轉換后的多項式可表示為

式中kn-1kn-2,…,k1k0是轉換后R進制數各位的系數。將等式兩邊分別除以基數R,得到下式:

其中,余數為k0,是轉換的R進制數的最低位,商為kn1 ×Rn-2+kn-2×Rn-3+…+k1×R0。把商再除以基數R,可以得到余數k1和新的商,每次給新商除以一次基數R,都可以得到一位新的余數,直到得到最高位為kn?1,商為0為止。所得余數自高而低排列,按照求解順序則是倒序排列,就可以得到R進制的數據。所以,對于十進制整數,通過對商除以基數R,逐步獲得余數,將余數倒序排列的方法,實現十進制數到R進制數的轉換,稱為基數除法轉換法。根據這種方法,把十進制數19轉換為二進制數:

根據計算得出19 = (10011)2

② 小數部分。

不管十進數小數部分0.M是多大,假設0.M轉換為R進制數后位數為m位,系數用ki表示,則數制轉換后的多項式可表示為

將上式兩邊乘以R,得到下式:

乘以R后,第1位小數k?1變為整數,即求出第1位小數,k?2變為第1位小數,把剩下的小數再乘以R,求出k?2,依次求出所有小數位為止。對于十進制小數數據向R進制數據的轉換,采用逐步取小數數據乘R,求出整數,然后將整數按照求出順序排列,最終得到R進制小數的方法,這種方法稱為基數除法轉換法。根據這種方法,把十進制數 0.375 轉換為二進制數:

根據計算得出 0.375 = (0.011)2

如果小數部分位數是無窮的,要根據要求選擇適當的位數。

【例1.5】將235.68轉換為五進制數。

①將整數235轉換為五進制數,采用基數除法。

②將小數0.68轉換為五進制數,采用基數乘法。

通過基數乘除法運算,將十進制數235.68轉換為五進制數(1420.32)5。與例1.3作比較,計算的結果是準確的。

(3)仸意進制數之間的相互轉換

上述(1)實現了仸意進制數到十進制數的轉換,(2)實現了十進制數到仸意進制數之間的轉換,所以兩種仸意進制數之間的轉換,只要把其中一種進制數轉換為十進制數,然后再把十進制數轉換為另一種進制數即可。

【例1.6】將五進制數(421)5轉換為六進制數。

① 將(421)5轉換為十進制數。

② 將十進制數轉換為六進制數。

所以,(421)5=(303)6

(4)八進制數、十六進制數轉換為二進制數

八進制數最大系數7轉換為二進制數時可用3位二進制數111表示,為了表示規則一致,表示位數最少,多位八進制數轉化為二進制數時,每位系數只能都轉換為3位二進制數,而且必須轉換為3位二進制數。同理,十六進制數最大系數F(15)轉換為二進制數時用4位二進制數1111表示,多位十六進制數的每位系數轉換為二進制數時,只能用四位二進制數而且必須用四位二進制數表示。

【例1.7】將(5210.634)8和(5BE2.1C)16轉換為二進制數。

根據上述分析,向二進制數轉換,八進制數每位系數必須轉換為3位二進制數,十六進制數每位系數必須轉換為4位二進制數。所以,兩個數轉換的結果是:

(5)二進制數轉換為八進制數、十六進制數

觀察例1.7中由八進制數和十六進制數轉換為二進制數的結果,每一個系數可以表示為等長度的二進制數。而等長度的二進制數的排列,是以小數為中心,向兩側各取等長度單位的數字實現的。所以,要把二進制數轉換為八進制數,只要以小數點為中心,向兩側各取3位,然后把每3位二進制數轉換為八進制數即可。同理,將二進制數轉換為十六進制數,同樣以小數點為中心,向兩側各取4位,然后把每4位二進制數轉換為十六進制數即可。在取數過程中,如果位數不夠,則填0補足規定位數,然后再進行數制轉換。

【例1.8】將二進制數(10101100010.011111)2轉換為八進制數、十六進制數。

① 轉換為八進制數。

② 轉換為十六進制數。

八進制數和十六進制數之間可以通過二進制數為中介進行轉換。下式是轉換的實例:

4.二進制數的算術運算

在邏輯表達過程中,數值型數據都是用邏輯常數0、1自高位到低位排列而成。按照有無符號,數值型數據包括無符號數和有符號數兩種;按照數據存放的格式,數據分為定點純整數和定點純小數。我們主要研究無符號數的加、減、乘、除運算,有符號數的定點純整數或定點純小數在邏輯中的表示方法、數據格式及范圍、有符號數的運算等。

(1)無符號二進制數的算術運算

無符號數是指數值型數據所有系數全為數據,沒有正負數的區分。運算規則采用二進制數的運算規則,加法規則為“逢2進1”,減法規則為“不夠減向高位借1變2”。計算過程參照前面所述的五進制數的加、減、乘、除運算。

①無符號二進制數的加法。

加法規則為:0+0=0,0+1=1+0= 1,1+1=10。

計算10110和10100的和:

②無符號二進制數的減法。

減法規則為:1 ? 0 = 1,1 ? 1 = 0,0 ? 0 = 0,10 ? 1 = 1,其中被減數要大于減數。

計算1010和0101的差:

③無符號二進制數的乘法運算。

計算1011和1010的積:

由上述運算可以看出,乘法運算是由左移被乘數和加法運算組成。

④無符號二進制數的除法運算。

計算1010和111商和余數:

由上述運算過程可見,除法運算由右移被除數與減數運算組成。

(2)有符號二進制數的表示與運算

在日常生活中,數據有相對立的兩種表示形式,例如,多栽了98棵樹,可以用+98表示;少栽了15棵樹,可以用?15表示。因此,數據表示時一般是分為正數和負數的。在編輯過程中,帶有正負號的二進制數稱為真值,如+1101.11B,?100010.001B。而在邏輯表達過程中,除了用二進制數表示數據之外,還需要用邏輯常數來表示正號和負號,因符號只有“+”“?”兩個,邏輯常數只有“0”“1”兩個,兩者可以一一對應表示,一般把二進制數的最高位作為符號位,“0”表示為正號,“1”表示為負號。

在邏輯表達數值型數據過程中,可將真值表示為有符號數,一般有原碼、反碼、補碼、移碼4種表示形式,數據的位數一般是2i(i>2)位,如8、16、32位等。在數字電路中,有符號數一般是用補碼來表示的,因此,我們主要討論補碼的加減運算,并進行數據的溢出判別。在數字電路中表示的有符號二進制數,我們也稱為機器數。

機器數包括定點純整數和定點純小數,對于較大或位數較多的數據,可以用科學計數法表示。科學計數法表示的數據由定點純整數和定點純小數復合而成。

① 原碼表示法。

用二進制數“0”和“1”分別表示真值X中的“+”和“?”,數據位保持不變,就得到數據真值對應的原碼表示。一般用 8 位二進制數作為表示一個數據的最小單位,稱為字節(Byte)。二個字節數據稱為一個字(Word),兩個字稱為雙字(DWord)。

如果機器數為 8 位定點純整數,真值X=+ 1011110B,則[X]= 01011110B;如果X=?1011110B,則[X]= 11011110B。

如果機器數為 8 位定點純小數,X=+0.1011110B,則[X]= 0.1011110B;如果X=?0.1011110B,則[X]= 1.1011110B。

同一真值數X,機器數的位數不同,得到的原碼長度不同,則原碼就不相同。不管機器數位數是多少位,符號位永進處在最高位。

0是一個特殊實例,8位二進制數+0000000B和?0000000B的原碼表示如下:

[+0000000]= 00000000B

[?0000000]= 10000000B

可以看出,0的原碼表示有兩種,即有重碼。

根據原碼表示數據的規律,我們可以得到求解原碼的定義:

對上述定義來說,X 為二進制數真值,2n稱為機器數的模。“模”是指一個計量系統的計數范圍。如時鐘中的一小時就是60分鐘,這個60分鐘就是“模”。“模”實質上是計量器計滿數后產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數。因此,對于n位定點純整數來說,它的模是2n;而對于定點純小數而言,可以把定點純小數看做定點純整數,它的模也是2n,求出原碼后,再轉換為定點純小數。也可以求定點純小數的溢出量21,則n為1。

【例1.9】用原碼定義求二進制數+1001101B和?0.110110B的8位原碼。

因為真值+1001101為正數,所以使用定義[X]= 2n+X求原碼。則:

[+1001101B]= 28 + 1001101 = 100000000 + 1001101 = 101001101B

計算的結果是9位,而機器數是8位,第9位數據自動舍棄。所以,計算的結果為

[+1001101B]= 01001101B

而真值?0.110110B為負數,包括符號位在內不足8位,應該在末尾填一個0,然后把8位小數看做8位整數?1101100B,使用定義[X]= 2n?1 +|X|計算其對應的原碼。

[+1001101B]= 27 +|?1101100B|= 10000000 + 1101100 = 11101100B

將其轉換回定點純小數。

[+0.1001101B]= 1.1101100B

也可以使用定點純小數的模來計算,此時n=1,則:

[+0.1001101B]= 21?1 +|?0.1101100B|= 1.0000000 + 0.1101100 = 1.1101100B

對于定點純小數,兩種計算方法所得結果是相同的,對模的理解要從溢出數據的角度考慮。

②反碼表示法。

反碼也是表示有符號二進制數的一種機器數,不管是定點純小數還是定點純整數,都可以看做定點純整數,如果機器數的位數為n,真值數為X,2n為機器數的模,則X反碼的定義根據正負數的不同而不同,其定義如下:

從定義來看,對于正數來說,反碼的定義和原碼是相同的,所以,反碼就是原碼。而對于負數來說,需要根據定義[X]反 = 2n+ X ? 1 計算得出反碼。試根據定義求二進制數?1001B的8位反碼。

[?1001B]= 100000000 ? 1001 ? 1 = 11110110B

【例1.10】求二進制數?0.1001B的8位反碼。

方法一:以整數的方法求反碼。

因小數位只有4位,應該在末尾補3個0,符號位1位,是最低整數位,則可把?0.1001B看做8位整數?1001000B,利用公式[X]= 2n+X? 1計算得出反碼。

[?1001000B]= 100000000 ? 1001000 ? 1 = 10110111B

把所求的結果轉換為小數的反碼。

[?0.1001B]= 1.0110111B

方法二:以小數的方法求反碼。

以小數方法求反碼,模是21,公式[X]= 21 +X? 1中減去的1,是指在小數最末尾減去1,如果小數位為m位,則該位1的大小是2?m。利用該公式求出反碼。

[?0.1001B]= 21 ? 0.1001 ? 1 = 10.0000000 ? 0.1001000 ? 0.0000001 = 1.0110111B

通過定義法計算出的反碼,我們通過觀察,可以得出直接計算的規律。

● 對于正數,反碼等于原碼。

● 對于負數,在原碼的基礎上,符號位不變,其他位取反。

二進制純小數?0.1001B的8位原碼是1.1001000B,符號位不變,其他位取反,得到數據為1.0110111B,這與我們根據定義得到的結果是一致的。

③ 補碼表示法。

補碼是表示有符號數中最常用的一種機器數。用補碼表示帶符號的二進制數時,符號位與原碼、反碼相同,即用0表示正,用1表示負;數值位與符號位相關,正數補碼的數值位與原碼、反碼相同。而負數補碼的數值位是真值的數值位按位變反,并在最低位加 1。根據其運算規律,對于二進制數真值X,補碼的定義表示如下:

[X]=2n+X

在上式中,2n是數據的模,忽略定點純小數的小數點,則n可以看做機器數的位數,根據定義計算出補碼后,再轉換回定點純小數。如果以小數的方式計算,則模對應的溢出值是21

對于正數而言,原碼、反碼、補碼定義是相同的,因此原碼、反碼、補碼都等于原碼,我們求出原碼即可。而對于負數,補碼的定義比反碼的定義少一個末位1,我們只要在反碼機器數末位加一個1,就會得到負數的補碼。

【例1.11】用定義法和直接轉換法兩種方法求二進制數?0110110B與?0.01011B的8位補碼。

步驟1:求整數?0110110B的補碼。

根據定義[X]=2n+X求補碼,將n= 8,X=?0110110B代入公式中。

[-0110110B]=28-0110110=100000000-0110110=11001010B

也可以直接進行計算,先求出原碼,再轉變為反碼,最后在末位加1。

[?0110110B]= 10110110B

[?0110110B]= 11001001B

[?0110110B]= [?0110110B]+ 1 = 11001001 + 1 = 11001010B

兩種方法計算的結果是完全相同的。

步驟2:求小數?0.01011B的補碼。

首先使用定點純小數求補碼的定義[X]=21+X求?0.01011B的補碼。

[-0.01011B]=21-0.01011=10.0000000-0.0101100=1.1010100B

接著用整數的定義求補碼,將小數?0.01011B看做整數?0101100B,利用定義[X] 28= + X

求出補碼。

[0101100B]28= -0101100=1000000000101100=11010100B

將整數的補碼轉換為小數的補碼。

[0.01011B]=1.1010100B

最后使用直接計算的方法求小數?0.01011B的補碼。

[?0.01011B]= 1.0101100B

[?0.01011B]= 1.1010011B

[?0.01011B]= [?0.01011B]+ 1 = 1.1010011 + 0.0000001 = 1.1010100B

三種方法所求結果完全相同。

④移碼表示法。

移碼,又叫增碼,是符號位取反的補碼,一般用做浮點數的補碼,引入的目的是為了保證浮點數的機器零為全0。

如果機器數為n位,則移碼的定義為

[X]=2n-1+X

根據移碼、補碼定義,求二進制數?1011010B的8位移碼、補碼。

[?1011010B]= 28?1 ? 1011010 = 10000000 ? 1011010 = 00100110B

[?1011010B]= 28 ? 1011010 = 100000000 ? 1011010 = 10100110B

比較?1011010B移碼與補碼的數據,發現兩者除了符號位相反外,數據位是完全相同的。所以說移碼是一種補碼。

而對于移碼來說,+0和?0的移碼是相同的,都是10000000B,使0的有符號數據表示具有了唯一性。

在移碼進行加減運算的過程中,因為其符號位參與2次運算后變為補碼的符號,需要對符號位進行修正,才能獲得移碼表示的符號位,其方法只要將結果的符號位變反即可。

⑤機器數表示的數據范圍。

用邏輯常數表示的有符號數,它們的位數是有限的,它們所表示的數據大小也在一定的范圍之內。這里假定定點純小數和定點純整數的位數都是n位,則計算數據范圍的方法并不相同。

原碼與反碼是從真值數轉換而來,它們的范圍就是n位真值數表示的范圍。對于n位定點純整數表示的真值數,它的最大數是除正號外數字位全為1的數。該位數據的大小為2n?1?1,計算方法是在最末位加1后,得到和為2n?1,然后再減去加上的1,就得到最大的數;而最小的數是負數,是真值數的數據位全為1的數,它的數據大小也是2n?1?1,因此最小數是-(2n-1-1)。所以,對于n位定點純整數,它的原碼和反碼表示的數據范圍是[-(2n-1-1),2n?1?1]。

對于n位定點純小數,小數位為n?1位數據,因此,其最大數據是數據位全為1的正數,在最末位加1(2?(n?1))后,得到的結果是1,用1減掉加上的數據2?(n?1),得到的數據1?2?(n?1)就是最大的數值。因此,對于n位定點純小數,它的原碼和反碼表示的范圍為[?(1?2?(n?1)),1?2?(n?1)]。

而補碼與移碼的符號位可以參與運算,對于負數而言,符號位可以單獨表示一個數字1,因此它的范圍應該比原碼、反碼多了一個臨界的最小數?2n?1(針對定點純整數而言)。因此,n位定點純整數補碼表示的數據范圍是[?2n?1,2n?1?1],而n位定點純小數補碼表示的數據范圍是[?1,1?2?(n?1)]。

⑥ 二進制數補碼的加減運算及溢出判別。

在數字電路,特別是在微型計算機中,有符號數的加減運算一般都是采用補碼運算的。采用補碼進行運算,符號位也參與運算,因此無須考慮符號位的變化情況。

假設有兩個二進制真值數XY,要計算它們在邏輯過程中進行加、減運算的補碼數據結果。要實現該計算過程,真值數首先要進入邏輯表達過程,在邏輯過程中的數據是補碼表示的,這兩個真值數會自動轉換為補碼表示的數據,得到[X]和[Y]。因此,我們要求[X+Y]和[X?Y]補,就得找出它們和[X]、[Y]之間的關系式。

通過分別對定點純整數和定點純小數補碼運算進行分析和證明,我們可以得到如下的關系表達式:

[X+Y]= [X]+ [Y]

[X?Y]= [X+ (?Y)]= [X]+ [?Y]

【例1.12】X = 56,Y = ?61,設機器數為8位,求[X + Y]和[X ? Y]

分析:提供的數據是十進制數,需轉換為8位二進制數,然后將兩個二進制數送入邏輯過程,自動轉換為8位補碼,最后按照公式實現求補碼的過程。所以,直接求和、差再求補碼的方法,不符合邏輯計算的過程,先計算XY及?Y的補碼,然后代入公式中進行計算,才和邏輯計算過程相當。

根據十進制數向二進制數的轉換過程,X = 56的二進制數是+0111000B,Y = ?61的二進制數是?0111101B。分別求56,?61,61的補碼。

[X]= [56]= 00111000B

[Y]= [?61]= 11000011B

[?Y]= [61]= 00111101B

將數據代入表達式中:

[X+Y]= [X]+ [Y]= 00111000 + 11000011 = 11111011B

[X?Y]= [X]+ [?Y]= 00111000 + 00111101B = 01110101B

對于上述運算過程,因為計算出的結果位數只能是n位,所以同符號數相加,異符號數相減,得到的結果都有可能達到 n + 1 位,這稱為溢出。產生溢出的數據運算,對于實際工作過程毫無意義。因此,在進行補碼運算的過程中,我們需要對溢出進行判斷。

根據研究,我們得出了溢出發生時存在的條件,就是“最高兩位產生的進位如果不相同,則發生溢出現象”。例如,對于8位數據的補碼00111000B(56)和01001001B(73)進行補碼加法運算,產生的數據超過了127,所以數據發生了溢出現象。通過列豎式可以得到運算過程和進位情況,如下所示:

觀察所列豎式,最高兩位產生的進位為01,所以這兩個補碼數相加,產生溢出現象。

⑦浮點機器數的表示與運算。

在邏輯表達中,數值型數據只能用定點純整數和定點純小數表示,而對于浮點數數據,我們將如何表示呢?與十進制數的浮點數表示方法相比較,二進制數對應的浮點數也可以采用科學計數法來表示,表示形式如下:

M 2N×

上式中的M稱為尾數,是二進制數表示的定點純小數,以補碼形式表示,定點純小數采用雙符號位;N稱為階碼,是定點純整數表示的移碼。表示數據時,雙符號位在前,階碼和尾數依次排列在后面,數據格式為

某浮點數?0.1010B ×211表示的浮點二進制數為16位,其中雙符號位為2位二進制數11B,階碼為7位,采用移碼表示;尾數為7位,為定點純小數,采用補碼計算所得,則:階碼采用移碼表示:[11]移= 1001011B。

尾數采用補碼表示:[?0.1010]尾數= 0110000B。

該浮點數的機器數表示:11 1001011 0110000B。

浮點數的加、減運算過程一般是先進行對階運算,再把尾數相加減,然后進行數據規格化。而乘除法運算一般先進行階碼加減運算,再進行尾數的補碼乘除法運算,然后重新規格化。

1.2.2 非數值型數據的邏輯表示

在數值型數據的表示過程中,無符號數是采用二進制數的位權表示法來表示的,沒有明確位數多少的規定。而有符號數除了要約定數據的位數和進制數的位權表示法之外,還要指出符號位與二進制數的一一對應關系。這種對數據位數、數據組成規則作出明確約定的二進制表示形式,稱為編碼。原碼、反碼、補碼、移碼都可以認為是一種編碼。

1.編碼及編碼方法

除了數值型數據之外,其他數據都是非數值型數據,比如一個蘋果的照片、發出的聲音、鍵盤的字符、文字等。它們在邏輯表達過程中,要對同類同時出現的信息屬性統一進行編碼。首先分析同類信息中有多少種不同屬性的數據,這些屬性可能是控制的條件、反映的狀態以及實際的二進制數等,根據每種屬性的不同數量確定屬性的編碼位數。如果某類信息的某種共同屬性有N個條件,我們需要n位二進制數來表示它,即對其編碼,則Nn應該滿足如下條件:

2n-1N≤2n

將所有屬性對應的編碼按一定順序進行排列,得到的就是整類信息對應的編碼。在編碼中,尋找所有共同屬性的二進制數的編排規則,即編碼方法,這是最為重要的。

【例1.13】某地區7所中學舉行聯合運動會,要求所有學校最多派出15名運動員,請用邏輯常量對運動員進行編碼。

分析:確定編碼的對象為參加比賽的運動員,目標是對運動員進行編碼(編號)。進行編碼時,首先要指出運動員屬于哪所學校,然后指出運動員是這所學校的第幾個運動員,“所在學校”和“本校編號”就是該信息的兩種屬性。所以對所有運動員進行編碼,就是對所有學校和每個學校的所有學生進行編碼。因為運動員隸屬于某所學校,所以一般把學校編碼置于運動員編碼之前,則組合的編碼格式為

根據上述分析,我們對運動員進行編碼,首先要計算出學校編碼和運動員編碼的位數,然后確定兩種編碼的數字,最后指出編碼如何實現。

(1)計算各種屬性編碼位數

① 學校編碼位數計算。

學校屬性是指“運動員屬于哪所學校”,應該為每一所學校指定一個編碼數字,作為識別的標志。N = 7為參加運動會學校的總數,設學校編碼位數為n1,則22= 4< 12n≤23= 8,n1= 3,即至少需要使用3位二進制數來表示運動員所在的學校,而且只能使用3位二進制數表示。能使用3位而不使用更多的二進制數,是為了不增加邏輯問題的復雜性。

② 運動員編碼位數計算。

運動員屬性是以所有學校最大運動員數量為前提進行屬性設置的,運動員的最大數量為15,即編碼數量N = 15,設其編碼位數為n2,則23= 8< 22n ≤24= 16,n2= 4,應使用4位二進制數為每所學校所有運動員編碼。

(2)為各種編碼分配數字

學校編碼為3位,共有000~111八組二進制數字,而學校只有7所,從其中選擇仸意7組二進制數分別指定給這7所學校,共有 78C 8= 種配置方法。這里我們取數字000~110,按照自然順序編碼指定給這7所學校。同理,運動員編碼為4位,共有15名運動員,則在0000~1111中仸取15組數字一一對應指定給這些運動員,共有種取法,同樣采用自然順序編碼。這些自然順序碼都是從0開始編碼的。

(3)編碼實現

在為每所學校指定編碼數字后,只要知道運動員在本校的編號,運動員的編碼數字就被確定下來,編碼即被實現。例如,某運動員的編碼是101 1100B,表示該運動員是第5所學校的第12名運動員。

2.常用編碼

在邏輯表達過程中,常用的編碼有:將十進制系數表示為二進制數的二—十進制編碼,鍵盤上所有字符對應的編碼——ASCII碼,用于電路化簡的編碼——格雷碼等。

(1)二—十進制編碼

十進制數是日常生活中常用的數制,在邏輯表達過程中,要對十進數進行表示,就是對0~9之間的10個系數統一進行二進制編碼。根據編碼規則,10個十進制系數需要4位二進制數對其編碼。這種把1位十進數系數轉換為4位二進制數表示的編碼,稱為二—十進制編碼,簡稱BCD(Binary Coded Decimal)碼。

4位二進制數共有16種組合,可以從中選擇10個編碼來表示十進制數的十個系數,根據不同的編碼規則,選擇的10組編碼也不相同。對于經常使用的BCD編碼,主要包括有權碼和無權碼。有權碼是指采用位權表示法表示的二—十進制編碼,十進制系數可以通過位權表示法計算出來;而無權碼的二進制數大小和十進制系數并沒有直接的計算關系,是通過編碼規則表達的。

有權碼主要有8421碼、2421碼、5421碼,名稱中的每位數字即為對應位的權值。8421碼又稱為自然順序碼,它選擇4位二進制數的前10組編碼0000~1001,按順序分別指定給十進制系數0~9。2421碼和5421碼最高位的權分別為2和5,代替了8421碼的8,0~4對應的編碼最高位系數為0,5~9對應的編碼最高位的系數為1。

無權碼主要有余3碼和余3循環碼,全部二進制編碼代表一定的含義,但每一位并不表示本位的權值。余3碼由8421碼加0011得到;余3循環碼特點是仸何相鄰的兩個碼字,僅有一位二進制位不同,其他位相同,它是余3碼的重新排列。

表1-3列舉了常用的幾種二—十進制編碼,從表中可以看到5種編碼的情況。

表1-3 幾種常用的BCD碼

(2)格雷碼

格雷(GRAY)碼是相對于自然順序碼而言的,按照一定的規則,針對自然順序碼求出的兩個相鄰格雷碼,僅有1位二進制數字不同。相鄰格雷碼只有1位二進制數不同,是一種電路設計中簡化電路的方法,稱為相鄰性。相鄰編碼不同數字的位數稱為碼距,格雷碼的碼距為1。在以編碼方式傳遞數據的過程中,相鄰的編碼碼距越小,避免錯誤編碼出錯的概率越低。

要通過自然順序碼求出格雷碼,首先要了解異或運算的定義和運算方法。當決定事件(F)的條件A、B不同時,事件(F)才發生,這種邏輯運算稱為異或運算。異或運算的表達式為

F = A⊕B

在式中,A、B是異或運算的兩個條件變量,F是邏輯結果,⊕是異或運算符。根據異或運算的定義,異或運算的運算規則如下:

0⊕0 = 0; 0⊕1 = 1⊕0 = 1; 1⊕1 = 0

根據自然順序碼和格雷碼之間的邏輯關系,我們通過邏輯設計可以得出求格雷碼的公式。設某n位自然順序碼為Bn1Bn-2…B2B1B0,其對應的格雷碼為Gn1Gn-2…G2G1G0,則求格雷碼的公式是:

【例1.14】求5位自然順序碼10110B的格雷碼。

設5位自然順序碼為B4B3B2B1B0= 10110,格雷碼為G4G3G2G1G0,根據求格雷碼的公式,列出下列求解過程:

所以,所求5位格雷碼為11101B。

根據以上規則,可以得到表1-4所示的3位自然順序碼轉格雷碼的轉換表。

表1-4 3位自然順序碼轉格雷碼表

如果已知格雷碼,我們也可求出對應的自然順序碼。設n位格雷碼為Gn1Gn-2…G2G1G0,所求自然順序碼為Bn1Bn-2…B2B1B0,根據它們之間的邏輯關系,通過邏輯設計,可以得到求自然順序碼的公式。

【例1.15】求5位格雷碼11101B對應的自然順序碼。

設5位格雷碼為G4G3G2G1G0 = 11101,所求5位自然順序碼是B4B3B2B1B0,根據格雷碼轉換自然順序碼的公式,計算過程如下:

所以,所求5位自然順序碼是10110B,和例1.14給出的5位自然順序碼是相同的,這證明了自然順序碼和格雷碼之間相互轉換關系是正確的。

(3)ASCII碼

計算機是典型的數字電路系統,常用的字符通過鍵盤輸入計算機中,為了便于識別,需要對鍵盤上的128個字符統一編碼。根據編碼規則,27 = 128,共需要7位二進制數b6b5b4b3b2b1b0對其進行編碼,這128組二進制數表示十進制數數字字符、英文大小寫字母、控制符、運算符及特殊符號等,這種編碼稱為美國標準信息交換碼(American Standard Code for Information Interchange),簡稱ASCII碼。ASCII碼30H~39H代表數字字符“0~9”;ASCII碼41H~5AH代表大寫字母“A~Z”;ASCII碼61H~7AH代表小寫字母“a~z”;“0A”代表換行符;OD代表回車符等。表1-5列出了所有ASCII碼編碼值及其對應的符號,而表1-6列出了一些字符表示的具體含義。

表1-5 ASCII碼表

表1-6 ASCII碼對應字符的含義

續表

主站蜘蛛池模板: 襄汾县| 宁强县| 大安市| 柯坪县| 义马市| 株洲市| 青川县| 柳州市| 汽车| 石河子市| 萨嘎县| 迭部县| 临猗县| 宁河县| 双柏县| 永顺县| 布拖县| 荣成市| 济阳县| 略阳县| 婺源县| 库车县| 雷州市| 调兵山市| 江达县| 资溪县| 乡宁县| 九江市| 德令哈市| 郑州市| 瑞丽市| 天长市| 米林县| 阿坝| 互助| 庆元县| 漯河市| 兴安县| 格尔木市| 洮南市| 保康县|