數字系統
數字邏輯是計算機科學的基礎,它研究的是如何通過邏輯門電路(與門、或門、非門等)實現各種邏輯功能。數字系統則是由數字邏輯電路組成的系統,可以實現各種復雜的運算和控制功能。在計算機科學中,數字邏輯和數字系統是非常重要的基礎知識,它們是構成計算機硬件和軟件的基礎。
數字系統定義了用獨特的符號(數碼)來表示一個數字。在不同的數字系統中,一個數字有不同的表示方法,使用有限的數字符號來表白數字。比如:阿拉伯數字數字系統:0、1、2、3、4、5、6、7、8、9;羅馬數字系統:I II III IV V VI VII... 。數字系統可分為:位置化系統和非位置化系統。
位置化和非位置化數字系統
在位置化數字系統中,數字符號所占據的位置決定了其表示的值。常用的有:十進制、二進制、十六進制和八進制。在該系統中,數字這樣表示:
它的值是:
其中:S是一套符號及,b是底(或基數),b=s符號集中的符號總數,+/-表示數字為正或負。例如:以十進制數字系統為例,則S表示的集合為 S={0,1,2,3,4,5,6,7,8,9},b=10;假設隨便取一個十進制數66,則它的數字表示為 +(66)10 (其中10為下標),只是一般省略+、()和底,直接表示為66,;如果是-66,則“-”符號不能省略。
注意:這些符號不能直接存儲在計算機中,計算機存儲正負數的方式不同。
十進制系統(以10為底)
在十進制系統中,整數(沒有小數部分的整型數字)使我們所熟悉的,我們在日常生活中使用整數。例如:520,它是一個三位數,實際上,它的計算方式為:5×10^2+2×10^1+0乘以10^0,即((10×100)+(2×10)+(0×1))=500+20+0=520。
有時我們需要知道用數碼k表示的十進制整數的最大值,該最大值=10^k-1。例如:k=4時,可以表示的數字最大值為10的4次方-1,即10000-1=9999。
此外,更為廣泛的是實數(帶有小數部分的數字),其指計算方式為:
例如:-66.66的值計算為 -(6×10^1+6×10^0+6×10^-1+6×10^-2),即-(6×10+6×1+6×0.6+6×0.06)=-66.66。
二進制系統(以2為底)
符號集為 S={0,1},底 b=2;該系統中的符號常被稱為二進制數碼或位(位數碼),數據和程序是以二進制模式(即位模式),存儲在計算機中的,這是因為計算機由電子開關制成,它們僅有開和關兩種狀態,1和0分別表示兩種不同的狀態。
同理,二進制系統數值計算方法如下:
例如:(1101.01)2(其中2為底數表示二進制),這樣一個二進制數字要轉換為十進制可以用:1×2^3+1×2^2+0×2^1+1×2^0+0×2^(-1)+1×2^(-2)=8+4+0+1+0+0.25=13.25
有時我們需要知道用數碼k表示的十進制整數的最大值,該最大值=2^k-1。?例如:當k=4時,最大值為(1111)2(其中2為底數表示二進制),其值為15=2^4-1。
十六進制系統(以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;底為 b=16。可能你會奇怪為什么不用10、11等數字來表示,而用字母來表示?因為在我們的數字系統中符號都是單個的,而且如果用10、11等數字來表示就容易出現歧義,如:1123,這里的11是表示兩個1還是11?因此為了避免這種情況,用字母來表示比較合適。
同理,十六進制系統數值計算方法如下:
用數碼k表示的十六進制整數的最大值,該最大值=2^k-1。?例如:當k=4時,最大值為(FFFF)16(其中16為底數表示十六進制),其值為16^4-1=65535。
八進制系統(以8為底)
符號集為 S={0,1,2,3,4,5,6,7},底 b=8;
同理,八進制系統數值計算方法如下:
?用數碼k表示的八進制整數的最大值,該最大值=8^k-1。?例如:當k=5時,最大值為(77777)8(其中8為底數表示八進制),其值為8^5-1=32767。
二進制、八進制、十六進制轉為十進制
將二進制、八進制、十六進制轉為十進制就是用下面公式:
其中將S替換為相應的符號集,b替換為相應的底數即可。?
例如此時有數字(1010)2(其中2為底數),則代入公式為:1×2^3+0×2^2+1×2^1+0×2^0=8+0+2+0=10
十進制轉為二進制、八進制或十六進制
轉換需要分為兩步,第一步為計算整數部分,第二步為計算小數部分。
首先整數部分計算規則為不斷除以要轉化進制的底數,直到商為0時停止,并且每一步計算之后記錄得到的余數,再將得到的余數倒著寫即可。例如:十進制數9轉換為2進制數的計算過程如下,得到的結果為(1001)2,其中2為底數表示2進制數。
接下里以十進制數172轉換為8進制數為例,轉換結果為254,計算過程如下圖:
接下來是小數部分的轉換,用十進制的小數乘以要轉化的進制的底數部分并取整數正序排列即可,而對于部分無限循環的則可以通過限制取到幾位即停止。例如:十進制數0.625轉換為小數部分計算規則如下:
具體過程為:首先將0.625×2得到結果為1.25,再將整數部分1取出,得到剩下的為0.25,再將0.25×2得到0.5,再將整數部分0取出得到0.5,再將0.5×2得到結果為1.0,此時取出整數部分1之后即可停止計算,因為小數部分為0不管怎么計算乘以任何數都是0;在將取出的整數順序排列即可得到結果,即十進制數0.625轉換為二進制數為0.101。
下面再給出一個例子:將十進制數0.634轉換為8進制數且結果精確到5為小數,結果為0.50446,具體計算過程如下圖:
二進制和八進制相互轉換
每三個二進制數都可以轉換為八進制數中的一位,如下圖
二進制數 | 八進制數 |
---|---|
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
只需要將二進制數每三位排在一起轉換為對應的八進制數字即可,例如:二進制數00011001,可以寫為 000 011 001,轉換為0 3 1,則對應的八進制數為31。
二進制和十六進制相互轉化
每四個二進制數都可以轉換為十六進制數中的一位,如下圖
二進制數 | 十六進制數 |
---|---|
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
只需要將二進制數每四位排在一起轉換為對應的十六進制數字即可,例如:二進制數00011001,可以寫為 0001 1001,轉換為1 9,則對應的八進制數為19。