標籤:style 使用 strong 問題 c 時間
一.為什麼會有10進位, 2進位,8進位,16進位?
10對我們來說是一個非常重要的數字。10是我們大多數人擁有的手指或腳趾的數目,因而我們人類已經適應了以10為基礎的數字系統. 我們通常使用的數字系統稱為以10為基礎的數字系統或十進位。這個數字系統對我們來說非常自然,因而我們很難想像出還有其他的數字系統。如果人類不是有那麼多隻手指,我們數數的方式就會有所不同,數字10就可能代表別的東西了。當我們明白了10可以指只有兩隻鴨子的時候,也就可以解釋開關、電線、燈泡、繼電器(或乾脆就叫電腦)是怎樣表示數位了。
如果人類像螃蟹那樣,每隻手上只有4個手指會怎樣呢?我們可能永遠都不會想到要發明一種以10為基礎的數字系統的問題,取而代之的是我們可能會認為數字系統基於8是正常、自然、合理、必然的,是毫無疑問的,是非常合適的。這時,就不能稱之為十進位了,得將它稱作為以8為基礎的數字系統或八進位。
如果數字系統是以8為基礎組織起來的,就不需要這樣的一個符號:9
把這個符號拿給任何一隻螃蟹看,都會有同樣的反應:“那是什嗎?它是幹什麼用的?”如果再仔細想一會兒的話,你會發現連這樣的一個字元也不需要:8
因為在十進位數字系統中,沒有專門用來表示10的符號,所在在八位元字系統中,也沒有專門用來表示10的符號。
在十進位數字系統中數數的方式是0、1、2、3、4、5、6、7、8、9,然後是10。在八位元字系統中數數的方式是0、1、2、3、4、5、6、7,然後是什麼呢?我們已經沒有符號可用了,唯一的一個有意義的可用符號是10,的確是那樣。在八位元中, 7之後緊接著的數字是10,但是10並不是指人類的手指那麼多的數目。
假定我們是海豚,並且必須用兩鰭來數數, 則這個數字系統就是基於2的數字系統或二進位的。這樣似乎只需要兩個數字,即0和1。現在, 0和1已是你要處理的全部問題,需要練習一下才能習慣使用位元。位元最大的問題是數字用完得很快。
是的,在二進位中,1後面的數字是10。這是令人驚訝的,但也並不奇怪。無論使用哪種數字系統,當單個位的數字用完時,第一個兩位元字都是10。在二進位系統中,可以這樣來數數:
0 1 10 11 100 101 110 111 1000
這些數看起來好像很大,實際上並不是這樣。更準確地說位元長度增長的速度要快過位元增大的速度,這有點像用牙籤吃東西,刺的塊很小且做起來很費力,吃一頓飯要花很長時間。
我們在寫十進位中比較大的數字時,通常每三個數字之間留一點兒空隙,這樣,我們一看就知道這個數的大概數值。例如,當你看到數字1 2 0 0 0 0 0 0時,你可能不得不去數其中0的個數,但如果看到的是120 000 000,則馬上就能知道是一億兩千萬。
位元的位長度增加得特別快。例如,一億兩千萬的二進位表示為:
1 0 11 0 111 0 0 0 11 0 11 0 0 0 0 0 0 0 0。為了讓它更易讀,通常是每四個數字之間用連字號或空格來分開。例如; 1 0 11 - 0 111 - 0 0 0 1 - 1 0 11 - 0 0 0 0 - 0 0 0 0。
不可能找到比位元字系統更簡單的數字系統了。位元字系統架起了算術與電之間的橋樑。我們所看到的開關、電線、燈泡、繼電器等物體都可以表示位元0和1:
電線可以表示位元字。有電流流過電線代表位元字1;如果沒有,則代表位元字0。
開關可以表示位元字。如果開關閉合,代表位元字1;如果開關斷開,代表位元字0。
燈泡可以表示位元字。如果燈泡亮著,代表位元字1;如果沒亮,代表位元字0。
電報繼電器可以表示位元字。繼電器閉合,代表位元字1;繼電器斷開,代表位元字0。
可見,位元與電腦密切相關!
大約在1 9 4 8年,美國數學家John Wilder Tukey (生於1 9 1 5年)提前認識到位元將在未來幾年中隨著電腦的流行而發揮更大的作用。他決定創造一個新的、更短的詞來代替使用起來很不靈活的五音節詞—binary digit。他曾經考慮用b i g i t或b i n i t,但最後還是選用了短小、簡單、精巧且非常可愛的單詞bit (位元)來代替binary digit這個詞。
為什麼引入八位元和十六進位數?
位元書寫冗長、易錯、難記,而十進位數與位元之間的轉換過程複雜,所以一般用十六進位數或八位元作為位元的縮寫。
二. 2進位的運算
1.二進位的加減乘除運算
在二進位中, 只有兩個數位0和1, 它有如下的加法和乘法
0+0=0
0+1=1
1+0=1
1+1=10
0*0=0
0*1=0
1*0=0
1*1=1
規則和十進位數的運算規則類似(不同的是1+1=10), 但比十進位的加法表和乘法表要簡單得多.
我們知道, 在十進位裡是根據"逢十進一", "借一當十"的法則進行的. 而在二進位裡, 我們只要根據"逢二進一", "借一當二"的法則, 就可以對位元進行加減乘除算術運算了.
11011
* 101
--------------
11011
11011
--------------
10000111
使用二進位, 乘法的速度提高了, 因為如果乘數是1, 可以將被乘數不變地寫在相應的位置上, 又可以將乘數中接連的幾個0跳過不用.
2.二進位的邏輯加乘非運算
除了加減乘除算術運算外, 還有一種是邏輯運算, 分別為邏輯加, 乘, 非.
邏輯加是按位元運算的, 只是沒有進位; 邏輯乘也是按位元運算; 邏輯非則是按位取反.
對於這三種邏輯運算, 在電腦內有三種基本的邏輯線路, "與"門, "或"門和"非"門, 通常稱為門電路.
"或"門是完成邏輯加運算, "與"門是完成邏輯乘運算, "非"們是完成邏輯非運算.
如果規定有訊號表示1, 無訊號表示0, 那麼或, 與, 非門就能完成邏輯加, 乘, 非三種運算了.
此外還有一些派生的邏輯運算, 如“異或”運算是實現“必須不同, 否則就沒有”這種邏輯的一種運算。
例如: 異或運算1010與0110, 結果是1100.
1010
0110
-------
1100
而電腦中二進位加減乘除算術運算可以用門電路組成的邏輯線路來實現.
三.門電路的邏輯線路如何?二進位加減乘除算術運算
所有的二進位運算都可以用與,或,非這三個基本的門來實現.而邏輯電路則是這三個基本門的組合,用來計算特定的功能,不同的運算可以選擇不同功能的邏輯電路來實現.
現已加法為例說明一下:
二進位加法的進位表
+進位 0 1
0 0 0
1 0 1
和與門的運算結果, 完全一致. 怎麼樣? 我們可以用一個與門表示二進位加法的進位, 而用或門表達二進位的加法, 或門不能表達的進位正好用與門彌補, 這樣一個完美的加法器就誕生了. 而能計算兩個1位的加法和並進位的叫半加器; 能計算兩個3位的加法和並進位的叫全加器.
四.不同進位之間的轉換
我們用電腦處理問題時,我們輸入的數字一般都是十進位數, 可是電腦並不懂得十進位,因此我們必須先把它轉化成位元才能被電腦所接受, 同理, 電腦計算出來的結果都是位元字,我們人類讀起來又很不方便,因此,也需要將位元轉換成人們習慣的十進位數,這樣每次計算的背後,都有著一次十->二進位, 二->十進位之間的轉換,雖然我們不必明白這裡面的道理照樣能使用電腦,但是對於想搞清楚電腦背後原理的人來說,弄懂它就很必要了,下面就看看不同進位數之間的轉換問題.
1.十進位數與二、八、十六進位數之間的轉換
1.1十進位數轉換成二、八、十六進位數
整數部分, 除基取餘, 如除(2,8,16)取餘.
1.2 二、八、十六進位轉換成十進位
按權展開.
2.位元與八位元之間的轉換
2.1 位元轉換成八位元
3位一組, 然後按權展開,加到一起即可.
2.2八位元轉換成位元
每個8進位數字用3位2進位數表示, 然後連在一起即可.
3.位元與十六進位數之間的轉換
3.1 位元轉換成十六進位數
4位一組, 然後按權展開,加到一起即可。
3.2十六進位數轉換成位元
每個數字用4位2進位數表示, 然後連在一起即可.
4.小數部分的轉換
乘基取整法, 分別用基數 R(R=2、8或16)不斷地去乘N的小數,直到積的小數部分為零(或直到所要求的位元)為止, 每次乘得的整數依次排列即為相應進位的數位。最初得到的為最高有效數字, 最後得到的為最低有效數字。
參考資料:
編碼的奧秘等.
附錄: 數制轉換的一些執行個體
1. R進位→十進位
(1)方法:人們習慣於十進位數,若將R進位數轉化為等值的十進位數,只要將R進位數按位權展開, 再按十進位運算即可得到十進位數,即按照冪級數展開。
(2)舉例:
例2.1.3 將位元(11011.101)2轉換成十進位數。
解:(11011.101)2=1×24+1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3
=16+8+0+2+1+0.5+0+0.125
=(27.625)10
例2.1.4 將八位元(136.524)8轉換成十進位數。
解:(136.524)8=1×82+3×81+6×80+5×8-1+2×8-2+4×8-3
=64+24+6+0.625+0.03125+0.0078125
=(94.6640625)10
例2.1.5 將十六進位數(13DF.B8)16[=(13DF.B8)H]轉換成十進位數。
解:(13DF.B8)16=1×163+3×162+13×161+15×160+11×16-1+8×16-2
=4096+768+208+15+0.6875+0.03125
=(5087.71875)10
2. 十進位→R進位
(1)方法:將十進位數轉換為R進位數,需將十進位數的整數部分和小數部分分別進行轉換,然後將它們合并起來。
十進位整數轉換成R進位數採用逐次除以基數R取餘數的方法:
(a)將給定的十進位整數除以R,餘數作為R進位的最低位(LSB).
(b)把前一步的商再除以R,餘數作為次低位。
(c)重複(b)步驟,記下餘數,直至最後商為零,最後的餘數即為R進位的最高位(MSB)。
十進位純小數轉換成R進位數,採用小數部分乘以R取整數的方法:
(a)將給定的十進位純小數乘以R,乘積的整數部分作為R進位小數部分的最高位;
(b)把第一步乘積的小數部分繼續乘以R,乘積的整數部分作為R進位小數次高位;
(c)重複(b),直到乘積的小數部分為0或達到一定的精度為止。
註:由精度確定小數位元的方法
因為R進位一位小數達到的精度為R-1,n小數達到的精度為R-n,故小數的位元n應滿足:
R-n≤給定精度
n取滿足上式的最小整數。
(2)舉例
例2.1.6 把十進位數(25)10轉換成位元。
解:由於二進位基數為2,所以逐次除以2取其餘數(0或1):
所以
(25)10=(11001)2
例2.1.7 將十進位數(25)10轉換成八位元。
解:由於基數為8,逐次除以8取餘數:
所以
(25)10=(31)8
例2.1.8 將十進位小數(0.375)10轉換成位元。
解:
(0.375)10=(0.011)2
例2.1.9 將十進位小數(0.39)10轉換成位元,要求精度達到2-10。
解:由於要求精度達到0.1%,2-10<0.1﹪,所以需要精確到二進位小數10位。
0.39×2=0.78 b-1=0
0.78×2=1.56 b-2=1
0.56×2=1.12 b-3=1
0.12×2=0.24 b-4=0
0.24×2=0.48 b-5=0
0.48×2=0.96 b-6=0
0.96×2=1.92 b-7=1
0.92×2=1.84 b-8=1
0.84×2=1.68 b-9=1
0.68×2=1.36 b-10=1
所以
(0.39)10=(0.0110001111)2
例2.1.10 將十進位小數(0.39)10轉換成八位元,要求精確到0.1%。
解:由於8-4<0.1﹪,所以需要精確到八進位小數的4位 0.39×8=3.12 b-1=3
0.12×8=0.96 b-2=0
0.96×8=7.68 b-3=7
0.68×8=5.44 b-4=5
所以
(0.39)10=(0.3075)8
把一個帶有整數和小數的十進位數轉換成R進位數時,將整數部分和小數部分分別進行轉換,然後將結果合并起來,例如,將十進位數(25.375)10轉換成位元,其結果為(11001.011)2
3.模為2n的不同進位之間的轉換
(1)方法:由於3位位元構成1位八位元碼,4位位元構成1位十六進位數位。故模為2m和2n不同進位之間轉換可將2m進位數轉換成二進位,再將二進位轉換成2n進位。
(a)2m進位轉換為2進位只需將2m進位的數位轉換為對應的位元即可。
(b)二進位轉換為2n進位時,對於整數部分,從低位向高位每n位二進位轉換成對應的2n進位數位,如位元不夠,可在前面補零;對於小數部分,從高位向低位,每n位二進位轉換為對應的2n進位數位,如位元不夠,在後面補零。
(2)舉例:
例2.1.11 把位元 (110100.001000101)2 轉換為八進位。
位元 110 100 001 000 101
八位元 6 4 1 0 5
(110100.001000101)2=(64.105)8
例2.1.12 把位元(110100.001000101)2=(64.105)8轉換為十六進位
位元 11 0100 0010 0010 1000
十六進位數 3 4 2 2 8
(110100.001000101)2=(34.228)16