閱讀898 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《計算機科學導論》一2.2 位置化數字係統

本節書摘來異步社區《計算機科學導論》一書中的第2章 ,第2.2節,[美]貝赫魯茲A. 佛羅讚(Behrouz A. Forouzan)著 劉藝劉哲雨等譯, 更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。

2.2 位置化數字係統

在位置化數字係統中,數字中符號所占據的位置決定了其表示的值。在該係統中,數字這樣表示:

image


它的值是:

image


其中,S是一套符號集;b是底(或基數),它等於S符號集中的符號總數,其中S1和Sk是代表分數部分或整個數字的符號。注意我們使用的表達式可以從右邊或從左邊擴展。也就是說,b的冪可以從一個方向由0到k-1,還可以從另一個方向由-1到-i。b的非負數冪與該數字的整數部分有關,而負數冪與該數字的小數部分有關。±符號表示該數字可正可負。本章我們將學習一些位置化數字係統。
2.2.1 十進製係統(以10為底)
本章首先討論的位置化數字係統是十進製係統。decimal(十進製)來源於拉丁詞根decem(十)。在該係統中,底b =10並且我們用10個符號來表示一個數。符號集是S ={0,1,2,3,4,5,6,7,8,9}。正如我們所知,該係統中的符號常被稱為十進製數碼或僅稱為數碼。本章中,我們使用±符號表示一個數可正可負,但記住這些符號並不存儲在計算機中—計算機用以處理該符號的方式不同,如第3章中討論的那樣。
計算機存儲正負數的方式不同。
在十進製係統中,數字寫為:

image


但是為了簡便,我們通常省略圓括號、底和正號(對於正數)。例如,我們把+(552.23)10寫成552.23,底和加號是隱含的。
1.整數
在十進製係統中,整數(沒有小數部分的整型數字)是我們所熟悉的,我們在日常生活中使用整數。實際上,我們使用它已經習以為常。我們把整數表示為±Sk-1…S2S1S0,其值計算為:

image

其中,Sk是1個數碼,b=10是底,k是數碼的數量。
另一種在數字係統中顯示一個整數的方法是使用位置量,即用10的冪(100,101,…,10k-1)表示十進製數字。圖2-1顯示了在十進製係統中使用位置量表示一個整數。

image
圖2-1 在十進製係統中使用位置量表示整數

例2.1 以下顯示了在十進製係統中使用位置量表示整數+224。
image

注意,在位置1的數碼2值為20,但是在位置2的同一個數碼其值為200。還要注意通常我們省略掉的加號,實際上是隱含的。
例2.2 以下顯示了在十進製係統中使用位置量表示整數-7508。我們已經使用1,10,100和1000來代替10的冪。
image

有時我們需要知道可以用數碼k表示的十進製整數的最大值。答案是Nmax=10k-1。例如,如果k=5,那麼這個最大值就是Nmax=105-1=99 999。
2.實數
在十進製係統中,實數(帶有小數部分的數字)也是我們所熟悉的。例如,使用該係統來表示元和分($23.40)整數。我們可以把實數表示為±Sk-1…S1S0·S-1…S-l,其值計算為:

image


其中,S1是1個數碼,b=10是底,k是整數部分數碼的數量,l是小數部分數碼的數量。十進製小數點是我們用於分割整數部分和小數部分的。
例2.3 以下顯示了實數+24.13的位置量。

image

2.2.2 二進製係統(以2為底)

我們在本章中討論的第二種位置化數字係統是二進製係統。binary(二進製)來源於拉丁詞根bini(二)。在該係統中,底b=2並且我們用兩個符號來表示一個數,即S={0,1}。該係統中的符號常被稱為二進製數碼或位(位數碼)。如我們將要在第3章看到的,數據和程序是以二進製模式(即位串),存儲於計算機中的。這是因為計算機由電子開關製成,它們僅有開和關兩種狀態。1位表示這兩種狀態之一,0位表示另一種狀態。
1.整數
我們可以把整數表示為±(Sk-1…S1S0)2,其值計算為:

image

其中,Si是1個數碼,b=2是底,k是數碼的數量。
另一種表示二進製數的方法是使用位置量(20,21,…,2k-1)。圖2-2顯示了在二進製係統中使用位置量表示一個數。

image


例2.4 以下顯示了與十進製數25等值的二進製數(11001)2。下標2表示底是2。

image


注意,相等的十進製數為N=16+8+0+0+1=25。
最大值
數碼k表示的二進製整數的最大值是Nmax=2k-1。例如,如果k=5,那麼這個最大值就是Nmax=25-1=31。
2.實數
在二進製係統中,一個實數(可帶有小數部分的數字)可以由左邊的k位和右邊的l位組成,±(Sk-1…S1S0·S-1…S-l)2,其值計算為:
image

其中,Si是1個位,b=2是底,k是小數點左邊位的數量,l是小數點右邊位的數量。注意k從0開始,而l從-1開始。最高的冪是k-1且最低的冪是-l。
例2.5 以下顯示了與十進製數5.75等值的二進製數(101.11)2。
image

注意,相等的十進製數為R=4+0+1+0.5+0.25=5.75。

2.2.3 十六進製係統(以16為底)

盡管二進製係統用於存儲計算機數據,但是它並不便於在計算機外部表示數字,因為與十進製符號相比,二進製符號過長。然而,十進製不像二進製那樣直接顯示存儲在計算機中的是什麼。在二進製位數和十進製數字之間沒有顯然的關係。正如我們看到的那樣,它們之間的轉換也不快捷。
為了克服這個問題,發明了兩種位置化係統:十六進製和八進製。我們先討論更常用的十六進製係統。hexadecimal(十六進製)來源於希臘詞根hex(六)和拉丁詞根decem(十)。為了和十進製與二進製一致,它應該稱作sexadecimal,根據拉丁詞根sex和decem。在該係統中,底b=16並且用16個符號來表示一個數。字符集是S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}。注意符號A,B,C,D,E,F(大寫或小寫)分別等於10,11,12,13,14和15。該係統中的符號常被稱為十六進製數碼。
1.整數
我們可以把整數表示為±Sk-1…S1S0,其值計算為:

image

其中,Si是1個數碼,b=16是底,k是數碼的數量。
另一種表示十六進製數的方法是使用位置量(160,161,…,16k-1)。圖2-3顯示了
在十六進製係統中使用位置量表示一個數。

image


例2.6 以下顯示了與十進製數686等值的十六進製數(2AE)16。

image

數碼k表示的十六進製整數的最大值是Nmax=16k-1。例如,如果k=5,那麼這個最大值就是Nmax=165-1=1 048 575。
2.實數
盡管一個實數可以用十六進製係統表示,但並不常見。

2.2.4 八進製係統(以8為底)

人們發明的與二進製係統等價並用於計算機外部的第二種係統是八進製係統。octal(八進製)來源於拉丁詞根octo(八)。在該係統中,底b=8並且用8個符號來表示一個數。字符集是S={0,1,2,3,4,5,6,7}。該係統中的符號常被稱為八進製數碼。
1.整數
我們可以把整數表示為±Sk-1…S1S0,其值計算為:

image


其中,Si是1個數碼,b=8是底,k是數碼的數量。
另一種表示八進製數的方法是使用位置量(80,81,…,8k-1)。圖2-4顯示了在八進製係統中使用位置量表示一個數。

image


例2.7 以下顯示了與十進製數686等值的八進製數(1256)8。
image

注意,相等的十進製數為N=512+128+40+6=686。
最大值
數碼k表示的八進製整數的最大值是Nmax=8k-1。例如,如果k=5,那麼這個最大值就是Nmax=85-1=32 767。
2.實數
盡管一個實數可以用八進製係統表示,但並不常見。

2.2.5 4種位置化數字係統的小結

表2-1是本章討論的4種位置化數字係統的小結。

image

表2-2顯示了數字15在十進製中使用2個數碼,在二進製中使用4個數碼,在八進製中使用2個數碼,在十六進製中僅僅使用1個數碼。十六進製表示法顯然是最短的。

image

2.2.6 轉換

我們需要知道如何將一個係統中的數字轉換到另一個係統中的等價的數字。鑒於我們更熟悉十進製係統,先講解如何從其他進製轉換到十進製。接著講解如何從十進製轉換到其他進製。最後講解如何簡便地進行二進製與八進製或十六進製之間的互相轉換。
1.其他進製到十進製的轉換
這種轉換是簡單而迅速的。我們將數碼乘以其在源係統中的位置量並求和便得到在十進製中的數。思路顯示在圖2-5中。
image

image

2.十進製到其他進製的轉換
我們能夠將十進製數轉換到與其等值的其他進製。需要兩個過程,一個用於整數部分,另一個用於小數部分。
(1)轉換整數部分
整數部分的轉換可使用連除。圖2-6顯示了該過程的UML圖。我們在整本書中使用UML圖。對於不熟悉UML圖的讀者可以閱讀附錄B。

image


我們稱十進製數的整數部分為源,轉換後的整數部分為目標。我們先創建一個空目標。接著反複除源並得到商和餘數。餘數插入目標的左邊,商變為新的源。圖2-7顯示了在每次重複中如何得到商。
下麵我們使用一些例子手工演示如圖2-7所示的過程。
image

例2.11 下麵演示如何將十進製數35轉換為二進製數。我們從這個十進製數開始,一邊連續尋找除以2得到的商和餘數,一邊左移。結果是35=(100011)2。
image

(2)轉換小數部分
小數部分的轉化可使用連乘法。我們稱十進製數的小數部分為源,轉換後的小數部分的數為目標。我們先創建一個空目標。接著反複乘源並得到結果。結果的整數部分插入目標的右邊,而小數部分成為新的源。圖2-8顯示了該過程的UML圖。圖2-9顯示了在每次重複中如何得到目標。我們使用一些例子手工演示如圖2-9所示的過程。


image

例2.14 將十進製數0.625轉換為二進製數。
image

解 因為0.625沒有整數部分,該例子顯示小數部分如何計算。這裏是以2為底。在左邊一角寫上這個十進製數。連續乘2,並記錄結果的整數和小數部分。小數部分移到右邊,整數部分寫在每次運算的下麵。當小數部分為0,或達到足夠的位數時結束。結果是0.625=(0.101)2。
image

(3)數碼的數量
在把數字從十進製轉換到其他進製之前,我們需要知道數碼的數量。通過k=logbN的關係,我們總可以找到一個整數的數碼的數量,其中x意味著最小的整數大於或等於x(這也稱為x的高限),N是該整數的十進製值。例如,我們可以找到十進製數234在所有4個係統中的位數,如下所示:
a.十進製:kd=log10234=2.37=3,顯而易見。
b.二進製:kb=log2234=7.8=8,因為234 = (11101010)2,所以正確。
c.八進製:ko=log8234=2.62]=3,因為234 = (352)8,所以正確。
d.十六進製:kh=log16234=1.96=2,因為234 = (EA)16,所以正確。
如果你的計算器不包括任意底的對數運算,參見附錄G關於如何計算logbN的信息。
3.二進製-十六進製的轉換
我們能輕鬆將數字從二進製轉換到十六進製,反之亦然。這是因為在這兩個底之間存在一種關係:二進製中的4位恰好是十六進製中的1位。圖2-10顯示了該轉換是如何進行的。
image

例2.19 下麵演示如何將二進製數(10011100010)2轉換為十六進製數。
解 我們先將二進製數排為4位一組的形式:100 1110 0010。注意最左邊一組可能是1到4位不等。我們根據表2-2所示的值對照每組等量轉換得到十六進製數(4E2)16。
例2.20 與十六進製數(24C)16相等的二進製數是多少?
解 將每個十六進製數碼轉換成4位一組的二進製數:2→0010,4→0100,以及C→1100。該結果是(001001001100)2。
4.二進製-八進製的轉換
我們能輕鬆將數字從二進製轉換到八進製,反之亦然。這是因為在這兩個底之間存在一種關係:二進製中的3位恰好是八進製中的1位。圖2-11顯示了該轉換是如何進行的。
image

例2.21 下麵演示如何將二進製數(101110010)2轉換為八進製數。
解 每3位一組轉換為1位八進製數碼。根據表2-2所示的值對照每3位一組等量轉換得到八進製數結果是(562)8。
例2.22 與(24)8相等的二進製數是多少?
解 將每個八進製數碼寫成對等的二進製位組,得到(010100)2。
5.八進製-十六進製的轉換
將數字從八進製轉換到十六進製並不難,反之亦然。我們可以使用二進製係統作為中介係統。圖2-12顯示了一個例子。
image

該步驟如下:
從八進製轉到十六進製,我們先將八進製轉到二進製。我們將位數重排成4位一組,找到十六進製的對等值。
從十六進製轉到八進製,我們先將十六進製轉到二進製。我們將位數重排成3位一組,找到八進製的對等值。
數碼的數量
從一個底向另一個轉換中,如果我們知道源係統數碼的最大數量,就能知道我們在目標係統中所需用到的數碼的最小數量。例如,如果在源係統中我們知道最多使用6個十進製數碼,那麼在目標係統中我們就知道要使用二進製數碼的最少數量。通常,假設在以b1為底的係統中使用k個數碼,在源係統中顯示的最大數是b1k-1。我們可在目標係統中擁有的最大數是b2x-1。因此b2x-1≥b1k-1。這意味著b2x≥b1k,也就是:


image

例2.23 找出二進製數碼的最小數,用於存儲一個最大6個數碼的十進製整數。
解 k=6,b1=10,b2=2,且x=「k×(log b1/ log b2)= 「6×(1/ 0.30 103)=20。最大的6數碼十進製數是999 999,並且最大的20位二進製數是1 048 575。注意,可以用19位表示的最大的數是524 287,它比999 999小。因此我們肯定需要20位。

最後更新:2017-06-21 16:32:17

  上一篇:go  activiti web流程設計器 工作流的 整合視頻教程 SSM和獨立部署
  下一篇:go  SSM springmvc mybatis 整合 bootstrap maven shiro druid ehcache SSM框架源碼