0 題記
在學習計算機基礎或者是數字電子技術、微機原理、單片機、C 語言等課程的時候,都會講到一個概 念:二進制數。就是這個二進制數難倒了很多的英雄漢,上面羅列的這些課程我都教過,這些課程有一個共 同的知識點就是二進制數,十進制數,十六進制數,還有八進制數以及他們的相互轉換,而對于電子類專業 的一門比較重要的課程--單片機,更是要用到二進制數和十六進制數。故而每次我講課時都會盡量詳細的 給學生講解這些內容。今天上午剛剛結束了兩個班的第一堂課,又勾起了我的回憶,讓我有一種把這部分知 識點寫下來的沖動,給那些剛剛開始學習數字電子技術、單片機、C 語言的學生們。以上是為這篇文章的來歷。
1 引子
隨著電的使用,電器應用越來越廣泛,人們對于電器的要求也越來越高,要求功能強大,還要智能
化,使用簡單化,這些要求讓數字電子技術應用范圍越來越廣泛,原先很多采用模擬電路的地方都被數字電 路取代了,特別是對于信號處理方面,隨著計算機科學與技術突飛猛進地發展,用數字電路進行信號處理的 優勢也更加突出。信號處理的一般方法都是先將模擬信號按比例轉換成數字信號,然后送到數字電路進行處 理,最后再將處理結果根據需要轉換為相應的模擬信號輸出。從一般的模擬信號到數字信號,要經過采樣、 量化、編碼,最終一個連續的模擬信號波形就變成了一串離散的、只有高低電平之分“0 1 0 1...”變化的數 字信號。自然界來的,或者通過傳感器轉化的主要是模擬信號,那么為什么要多此一舉把它們變為數字信號 呢?原因有以下幾點:
一、模擬信號有無窮多種可能的波形,同一個波形稍微變化就成了另一種波形,而數字信號只有兩種波 形(高電平和低電平),這就為信號的接收與處理提供了方便。即,數字信號易于傳輸,抗干擾能力強。
二、模擬信號由于它的多變性極容易受到干擾,其中包括來自信道的和電子器件的干擾,模擬器件難以 保證高的精度(如放大器有飽和失真、截止失真、交越失真,集成電路難免有零點漂移)。而數字電路中有 限的波形種類保證了它具有極強的抗干擾性,受擾動的波形只要不超過一定門限總能夠通過一些整形電路
(如斯密特門)恢復出來,從而保證了極高的準確性和可信性,而且基于門電路、集成芯片所組成的數字電 路也簡單可*、維護調度方便,很適合于信息的處理。特別是計算機科學技術發展后,很多模擬電路無法實 現的功能都可以在采用數字電路來實現。
而電子計算機的出現,讓數字電子技術有了更廣闊的發展空間,也讓我們的生活更加的豐富。手機帶 給我們聯絡的方便,電腦帶給我們工作和娛樂以及學習的便利,天上的飛機,路上的汽車,讓我們出行更加 方便,家中的空調冰箱洗衣機微波爐等讓我們生活更加舒適。在手機、電腦、飛機、汽車以及家電中都有一 塊或者多塊的微處理器在工作,而這些微處理器就是由數字電路構成的。
2 0 和 1 的舞蹈
2.1 二進制數的來歷
電,發明出來是為人類服務的,那么電路同樣的是為人們服務的,也就是說我們需要在電路中能夠幫 助我們做平時生活中的事情,這些事情應該是我們不用電也可以來做的。舉個例子,譬如我們生活中的數, 我們采用的是十進制數,今年是 2010 年,就是指從耶穌誕生之年到現在有 2010 年了,班上有 45 個人, 買了一條褲子花費 368 元等等,那么在這些數字的背后隱藏著什么呢?我們都知道 1+1=2,但是陳景潤花 費了很大的功夫才證明,這說明即使我們看起來很平常的的事情也隱藏著一些我們不知道的因素,在這里我 們不是來討論 1+1=2 的,因為我們不是頂極的數學家,但關于十進制數,我們可以討論一下一些普通人都 有能力理解的東西。2010,45,368 這些數字給我們提供了 2 個信息,數碼和數位,2010 由三個數碼
0,1,2 構成,45 由兩個數碼 4,5 構成,368 由三個數碼 3,6,8 構成,而且這些數碼的位置不一 樣,那么他們所代表的大小不一樣的,如圖 1:
|
圖中 10 就是基數,而 103 、 102 、 101 、 100 也就是 1000,100,10,1 就是權。所謂的權,就是在 這個數中占的數值大小。也就是說 2010 中的“2"代表了 2 個“千”,45 中的”4"代表了 4 個“十”,而 368 中 的”8“代表了 8 個“一”,而且同一個數碼放在不同的位置上就代表了不同數值,如 555 中,三個 5 的權分別
100,10,1,那么第一個 5 代表的數值就是 5X100,第二個 5 代表的數值是 5X10,的三個 5 代表的數
值是 5X 1。采用這種方法,我們就可以用有限的數碼來表示無限的數據了。
總結一下,十進制采用了 0,1,2,3,4,5,6,7,8,9 共 10 個數碼,基數是 10,進行運算 的時候,我們采用逢十進一。
這是我們現實生活中需要用到的十進制的一些情況,那么我們在數字電路中必然也要采用這種計數方 法,電路中傳輸的就是電壓和電流,我們要用 10 種不同的狀態來表示這 10 個數碼有點困難。我們舉例來 說吧,譬如有一個電壓,0~5V ,那么我們就可以這樣來表示 0~9 這 10 個數碼,如表 1。
表 1 電壓和數碼之間的對應關系
電壓 |
十進制數碼 |
電壓 |
十進制數碼 |
0V |
0 |
2.5V |
5 |
0.5V |
1 |
3V |
6 |
1V |
2 |
3.5V |
7 |
1.5V |
3 |
4V |
8 |
2V |
4 |
4.5V |
9 |
接下來就是要制造一個能夠精確的實現 0V,0.5V,1V,1.5V……4.5V 等各種電平的基本電路,但這一
件是非常困難的事情。兩個相鄰的電平只有 0.5V,電路受到干擾,電平偏移 0.5V,那么就變成另外一個數 據了,而要保證電平完全沒有漂移是不可能的,所以,十進制數在電路中很難直接實現了。即使勉強實現 了,數據傳輸的時候又遇到了更大的數據準確性的問題,因為電平經過導線傳輸的時候會變化,相鄰的兩個 電平很容易混淆。這種十進制數在數字電路中是沒法直接實現,更別說是在微處理器這種高頻電路中實現 了。這樣必然要另外想辦法了。而戈特弗里德·威廉·凡·萊布尼茨(Gottfried Wilhelm von Leibniz,1646
年 7 月 1 日~1716 年 11 月 14 日)在 18 世紀初提出的二進制幫助人們解決了問題,雖然萊布尼茨受中 國的易經八卦啟發而發明的二進制數最初不是用來設計電路的,因為那個時候人們才開始研究電的現象,電 燈,電池等都還沒有出現。但 20 世紀初人們制造出二極管、三極管、集成電路等的時候,卻把二進制拿來 用于電路的設計。二進制數因為只有兩個數 0 和 1,狀態也只有兩種,在電路中實現起來就方便的多了,只 要一個高電平和低電平就可以,甚至說有電流和無電流、有電荷和無電荷都可以表示,這樣的話電路的實現 非常簡單,而且這種電路也不容易受到干擾,抗干擾性好的多。還是以上面 0~5V 的一個電平來說明,看圖
2。
|
從圖 2 中可以看到,我們可以認為 0~1V 都是低電平,2.4V~5V 都是高電平,若假設低電平代表 0,高電 平代表 1,那么我們就實現了二進制數了,這個電路簡單,而且易與實現,電平允許有一定的漂移,提高了 抗干擾能力,數據傳輸可*性高的多。所以數字電路中采用了二進制數。
假若以高電平代表 1,低電平代表 0,則稱為正邏輯系統,反之,以高電平代表 0,低電平代表 1,
則稱為負邏輯系統,一般來說,我們采用正邏輯系統。
2.2 二進制數與十進制數
接下來我們就研究一下二進制數,注意了,下面我們純粹的研究二進制數,跟二進制的數字電路實現 沒有任何的關系了。
借助于十進制數的思路,我們的二進制數有兩個數碼:0 和 1,基數是 2,進行運算的時候是逢二進 一。舉例來說明,比如二進制數 10110(注意,讀這個數據的時候只需要把每一位數據讀出來就可以了,
千萬不要采用十進制數的讀法。即這個數讀作:一 零 一 一 零,而不是一萬零一百一 十,若按照十進制數
的讀法,會讓別人笑話的。切記切記)。對于這個數,我們知道它的每一位都有權,而且權是 2 的冪,即
10110 = 1X24 0X23 1X22 1X21 0X20 若我們把這些數字相加計算出數值來,就會發現它是一個 十進制數 22,這樣我們就把一個二進制數轉換為十進制數了。我們接下來就講二進制數和十進制數的相互
轉換問題。
隨便拿出一本教材來,關于二進制數和十進制數的相互轉換,都講了一個方法:二進制數轉換為十進 制數采用加權法,就是上面說的例子。而十進制數轉換為二進制數則分為整數部分和小數部分分別轉換,整 數部分用除 2 取余法,小數部分采用乘 2 取整法,然后要列豎式來求解。一般來說,我們在進行應用的時 候,譬如數字電路,單片機中使用的數字都是整數,而且只需要我們快速的計算出這個數據即可,若按照除
2 取余法來求解,則太費時間,這里我講一種方法,命名為“8421”法,可以快速的求解 255 以內的數據
(超過 255 的數據建議大家用計算器來求解,手算或者心算就太費勁了。)。這個方法就是利用權,一個 4
位的二進制數,它的每一位的權恰好是 8421,如圖 3。
圖 3 二進制數每一位的權
接下來我們就以一個具體的例子來說明這種方法的使用。先看二進制數轉換為十進制數的例子,就是 上面說的 10110 吧,把它的每一位的權都標出來,如圖 4。
16 8 4 2 1
1 0 1 1 0
圖 4 二進制數轉換為十進制數的例子
我們只要把數值是 1 的位的權加起來就可以得到對應的十進制數,即 16+4+2=22,完全一樣。但是比列
式子快速的多了,如果熟悉了每一位的權之后我們都可以心算,快速的算出結果為 22。
接下來講十進制數轉換為二進制數的例子,把十進制數 55 轉換為二進制數。開始運算之前先把圖 3
畫在草稿紙上,然后開始填 1,首先,55 在 64 和 32 之間,所以 64 處不能是 1,我們在 32 處寫 1,這個
1 的權是 32,那么我們還剩下 55-32=23,比 16 大,我們在 16 的位置上寫 1,這時候我們還剩下 23-
16=7,接著我們就可以在 4、2 和 1 的位置上分別寫一個 1,32+16+4+2+1 恰好等于 55,所以我們在 其他的位置上寫 0,把這個數寫出來 110111,就得到了轉換后的二進制數了。整個過程如圖 5 所示。
|
采用這種方法可以快速的實現二進制數和十進制數的相互轉換,這里要提醒大家一點了,我們只需要練習十
進制數 255 以內的數據和二進制數之間的相互轉換就可以了,太大的數據交給計算器來運算就好了,千萬 不要為難自己,非要去計算 52369 的二進制數,那將讓你失去許多樂趣的。相對于二進制數來說,我們只 要能計算 8 位以內的二進制數轉換為十進制數就可,超過 8 位的還是交給計算器吧。當然了,每個人都有自 己的自由,如果某人要手工計算 32 位二進制數轉換為十進制數或者把一個上億的十進制數轉換為二進制 數,我也沒有辦法。
在現實生活中,對于十進制數,我們自動的根據數據的大小調整數位,15 有兩位有效數字,那么我
們寫 15 就好,那么沒有人會寫成 00015 的,同樣的 369 有三位有效數字,也沒人會寫成 00369,因為 在數字的前面加 0 不改變大小,所以我們通常是省略前面的 0。但在數字電路中有另外一種情況,譬如我們 制造好了一個電路后,能表示 8 位二進制數,那么就必須制造 8 個基本元件,每個基本元件存儲一個二進制 數,那么表示任何一個數,都是這 8 個基本元件作為一個整體來表示的,這樣就會遇到多余的 0,如表示十 進制數 30,那么就是 00011110,前面的 0 你不能省略,因為你不能說最前面的 3 個元件不存儲數據了, 再者,電路造好之后你也不能隨便的用刀砍掉一部分。所以,在我們數字電路以及單片機課程中,一般遇到 的二進制都是位數固定的,我們在寫這些數據的時候一定不要省略前面的 0,那么這個固定的位數是多少呢?
8 的倍數,也就是說,一般來說都是 8 位數一組,或者是 16 位,32 位,64 位,128 位等。
針對單片機中二進制位數固定這一特點,這里有幾個名詞:位(bit),字節(Byte),字
(Word)。其中位就是二進制位,1 位就是一個二進制位,稱為 1bit,簡寫 1b,1 字節代表 8 個二進制的
位,1Byte=8bit ,1 字代表 2 個字節,1Word=2Byte。Byte 可以簡寫作 B,我們可以得到如下公式:
1B=8b,1Word=2B=16b
隨著計算機技術的發展,數據越來越多,我們還有幾個單位,KB,MB,GB,TB,其關系為:
1KB=1024B= 210 B
1MB=1024KB= 220 B
1GB=1024MB= 230 B
1TB=1024GB=2 40 B
2.3 十六進制數出世
數字電路中都用二進制數,計算機中當然也用二進制數,而我們要與這些電路打交道,必然要會二進 制數,大家看看以下這幾個二進制數,然后抄一遍:
第一個數:00001101
第二個數:0101001110011010 的三個數:11100101011100110011001011101111 第四個數:
1101010001111000001110110110111011100110000011100100010010011100
第一個數是 8 位,寫下來沒什么太大的關系,第二個數是 16 位,仔細的看一下,抄寫也可以,第三個是 32
位,我想可能要非常吃力的才能寫下來,也許還要多次才能正確的抄寫下來,那么最后一個 64 位的,有人
有勇氣面對它嗎?如果是寫滿了 0 和 1 的 20 張 A4 的紙呢,任是誰也會崩潰的,太苦惱了,如果每天都是 看到的都是這些數字,也只有神仙才可以做得到了。這還不算,怕的就是出錯了,滿目都是 0 和 1,稍微錯 了一位,面目全非了,所有的工作就要重新來過。有人會說,我直接轉換成 10 進制數來讀寫好了。但是二 進制數轉換為十進制數太繁瑣,誰能告訴我最后一個數對應的十進制數是多少呢?
二進制數難讀,難寫,數據位數多,寫和讀都不方便,而我們卻不能不看,不能不用,因為我們不能
不用數字電路,也不能不用計算機。當問題出現了,我們就要解決它,于是出現了十六進制。 十六進制有十六個數碼:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,基數是 16,
運算時逢十六進一。為什么說十六進制數解決了二進制數讀寫困難,也沒有十進制數轉換繁瑣的困局呢?因 為十六進制和二進制數相互轉換非常簡單,4 位二進制數對應于一位十六進制數,這樣就可以把上述冗長的 二進制數轉換為十六進制數。上面四個二進制數轉換為十六進制數為:
第一個數:0D 第二個數:539A 的三個數:E57332EF
第四個數:D4783B6EE60E449C
當你看到上面這組數據的時候,讀和寫的時候要輕松的多了吧,這樣我們被前面二進制數打擊的信心 又回來了。那么你一定迫切的想知道二進制數和十六進制數是如何轉換的吧。好吧,我們就來講二進制數和 十六進制數的轉換。
二進制數轉換為十六進制數:4 位一組,分別轉換;
十六進制數轉換為二進制數:1 位轉換為 4 位,原序排列。 在進行學習二進制數和十六進制數轉換之前,先看一個表格,
表 2 十進制數、二進制數、十六進制數的對應關系
十進制數 |
二進制數 |
十六進制數 |
十進制數 |
二進制數 |
十六進制數 |
0 |
0000 |
0 |
8 |
1000 |
8 |
1 |
0001 |
1 |
9 |
1001 |
9 |
2 |
0010 |
2 |
10 |
1010 |
A |
3 |
0011 |
3 |
11 |
1011 |
B |
4 |
0100 |
4 |
12 |
1100 |
C |
5 |
0101 |
5 |
13 |
1101 |
D |
6 |
0110 |
6 |
14 |
1110 |
E |
7 |
0111 |
7 |
15 |
1111 |
F |
我們只要對照這個表格,就可以很輕松的進行二進制數和十六進制數的轉換了。下面用具體的例子來說明。
例 1 把二進制數 1011 0110 轉換為十六進制數
首先把二進制數分組
1011 0110
B 6
則二進制數 10110110 轉換為十六進制數就是 B6 了。更多的位數一樣的轉換。
例 2 把二進制數 1110 1100 0111 0010 轉換為十六進制數 把二進制數分組
1110 1100 0111 0010
E C 7 2
轉換的結果為十六進制數 EC72
反過來,十六進制數轉換為二進制數則反過來,直接一位變為 4 位就可以了。例如把十六進制數
A157 轉換為二進制數,則
A 1 5 7
1010 0001 0101 0111
轉換后的結果就是 1010 0001 0101 0111。
正因為十六進制數和二進制數的相互轉換不需要進行計算,只是簡單的替換就可以,所以我們在很多 場合下經常用十六進制數來代替二進制數,在學習單片機課程的時候,經常遇到十六進制數,所以必須掌握 十六進制數和二進制數的相互轉換,而且要能熟練的轉換。針對表 2,我建議大家就用 8421 法來記憶,數 字都很小,即使記不住,臨時來計算也很快的。
二進制數和十六進制數能夠相互轉換,那么十進制數和十六進制數的相互轉換怎么做呢?十進制數和 十六進制數可以直接相互轉換,也可以用加權法,十六進制數的每一位的權是 1,16,256,4096……數 據運算量比較大,所以我們就簡單的計算一下 2 位的十六進制數和十進制數的相互轉換,太大的數據就不要 為難自己了,用計算器吧。我的方法是先轉換為二進制數,然后再把二進制數轉換為十進制數,這樣手算的 速度要快些。反過來,要把十進制數轉換為十六進制數,也是先把十進制數轉換為二進制數,然后在轉換為 十六進制數。
我們現實生活中使用十進制數,而計算機中使用二進制數,為了讀寫的方便,我們發明了十六進制 數,并且通過上面的學習我們也知道了如何快速的在這三種進制數據之間相互轉換,應該沒有上面太大的問 題了。但是還有一個問題,大家再看一看表 2,二進制、十進制、十六進制數據他們的數碼,你會發現數碼 有重合的部分,這就有問題了,如果出現了一個數據,如何知道是那種進制的數據呢?如
1110,145,562。可能有人會說,第一個數是二進制數,第二個和第三個數據是十進制數。但這是錯誤 的。就如一件衣服 200 元,如果在重慶,那么就是 200 人民幣,如果是在香港買的,那么就是 200 港元, 如果你跑到英國去買,那么可能會是 200 英鎊或者 200 歐元了,這可是不一樣的,而且差別很大。這個時 候你再來看看 1110 和 145 這兩個數,到底是什么進制的數據呢?不知道,除非做了說明。這就是我要講 的另外一個問題,對于任何一個數字,我們必須作出說明是什么進制數據才有意義,否則我們不知道它的真
實大小。那么如何來區分這三種進制的數據呢?我們采用在數字的末尾加一個字母來表示。
二進制的英文單詞是 Binary,十進制的英文單詞是 Decimal,十六進制的英文單詞是
Hexadecimal,所以我們就在二進制數后面加字母 B ,在十進制數后面加字母 D ,在十六進制數后面加字
母 H,這樣就可以區分這三種進制的數據了。如 1010B,145D,562H 等等。因為我們現實生活中用的最 多的是十進制數,所以十進制數后的字母 D 可以省略,直接寫 145,就如我們在中國買東西,標價是 200 的話默認單位就是人民幣了,但二進制數和十六進制數后的字母不能省略。
2.4 負號的解決之道
以上在討論數值的時候都只考慮了正數的情況,其實我們還使用負數以及小數,鑒于小數在我們課程 的學習階段用的不是很多,特別是 9051 單片機,對于小數的運算非常不擅長,所以也就很少用到了,自然 不會講太多。接下來我們就僅討論負數的問題。
在數學運算中,表示一個數的正負,我們在數據的前面加上一個 正號或者負號(+/-),但是在計算 機中,對于這個正負號的表示就有點問題了,計算機中只能使用 0 和 1,沒法使用+ -,那么我們如何表示 一個數值的正負呢?方法是用 0 和 1 來表示正負號。正常的情況下,我們用 0 來表示正號,1 來表示負號。 這樣,我們對于一個數值就有兩部分構成,符號位和數值位,符號位用 0 和 1 來表示正負,數值位表示大 小。計算機中的數值有很多,為了防止符號位和數值位不對應,我們一般把符號位和數值位作為一個整體來 處理。前面我們講過,在計算機中經常用到的單位是 Byte,有 8bit,我們就把最高位作為符號位,其他的 7 位作為數值位。如圖 6。
D7 D6 D5 D4 D3 D2 D1 D0
符號位 數值位
0 正數
1 負數
圖 6 符號位和數值位
這樣我們就可以用二進制數來表示負數了。如
+10=0000 1010B
-10=1000 1010B
這樣我們就不怕負數了。我們來計算一下+10 + (-10)的結果。在計算機中,+10 和-10 我們已經轉化 為二進制數了,這里直接列豎式相加就可以了
0000 1010
+ 1000 1010
————————————
1001 0100
為什么結果不是 0?難道+10 +(-10)不等于 0?答案肯定是 0 的,絕對是二進制數運算出錯,可是錯誤
在哪里呢?大家思考一下數學中對于兩個數據相加是如何做的?首先是比較兩個數的符號,如果符號相同, 那么兩個數值相加,符號不變,而如果兩個數值符號不同,則比較一下哪個數值大,用數值較大的減去數值 較小的,符號用數值較大的符號。也就是說,我們數學上計算的時候是分情況的,而在上面的式子中,我們 把符號也參與運算了,并沒有比較兩個數的數值大小。
問題出現了,那么就要解決它。計算機的先驅者們發現,若按照我們數學上的處理方法,則實現的電 路很復雜,便采取了另外一種方法,符號可以參與運算,而且結果也可以是正確的,這便是補碼表示。講補 碼的時候涉及到幾個概念:原碼,反碼,補碼。
原碼 最高位表示符號,其他位表示數值,則這種表示方法就是原碼。如
[+10]原=0000 1010B
[ -10]原=1000 1010B
反碼 對于正數,反碼和原碼一樣。對于負數,反碼就是把原碼符號不變,數值為取反,如
[+10]反=0000 1010B
[ -10]反=1111 0101B
補碼
對于正數,補碼和原碼一樣,對于負數,補碼就是把反碼加 1,如
[+10]補=0000 1010B
[ -10]補=1111 0110B
總結一下,對于正數,[X]補=[X]原
負數 ,[X]補=[X]反 +1
補碼費勁的得到了有水木好處呢?我們用補碼的話就可以直接帶符號參與運算了。還是上面的例子。
[+10]補=0000 1010B
+ [ -10]補=1111 0110B
———————————————————
1 0000 0000B
得到的結果是 0,可能有人說了,不是最前面有個 1 的嗎,怎么會是 0 呢。這里我們不要忘記了,在計算機 中,所有的數據位數是固定的,我們這里舉例為 8bit 的例子,那么得到結果后我們也只能保存八位,你看看 上面的結果,一共有 8 個 0,計算機只能保存這 8 個 0,最前面的 1 是不算在結果里的。所以,得到的結果 就是正確的。
補碼的運算中還有一個溢出的問題,大家可以試著用補碼來計算一下 -98+(-50),你會發現得到 了一個最高位是 0 的八位數,也就是說,變成了一個正數。這就是超出了數據范圍,產生了溢出。關于溢 出,因為不是重點,大家可以自己查書找到答案。
3 萬物歸于陰陽
《易傳》記錄“易有太極,始生兩儀。兩儀生四象,四象生八卦。"這里所說的兩儀,就是陰和陽。這 里所說的卦,是宇宙間的現象,是我們肉眼可以看見的現象,宇宙間共有八個基本的大現象,而宇宙間的萬 有、萬事、萬物,皆依這八個現象而變化,這就是八卦法則的起源。而八卦的來源就是陰陽。 我國古代人們 發明的太極八卦用陰陽能夠代表世間萬物,那么由 0 和 1 組成的二進制數自然能夠表示世間所有東西,而不 僅僅是幾個數字。也就是說我們現實生活中的圖形、圖像、聲音、文字、色彩等等,都可以用二進制數表 示,當然也可以在計算機中處理和顯示出來。其實這個做到了的,否則我們今天也就不會有電腦里的圖片、 音樂、視頻、文字等等,我們今天的世界將不會這么多姿多彩。
那么,單純的 0 和 1 如何表示世間的萬物呢?這里要講到一個詞:代碼。代碼,從字面意思來看, 就是代替的碼字,即我們找一組二進制數來代替,代替誰呢?代替世間的萬物。到這里可能有人會有疑問 了?既然是代替的,必然不是真的,有什么用呢?自然有用,要是沒用的話我們不會隨時隨地的使用。其實 我們就是生活在一個代碼的世界里,如我們的名字就是一個代碼,用漢字給我們每個人的一個代碼,代表一 個個體。在學校里,每個學生都有一個學號,而這個學號就是一個代碼,用一組十進制數來代表一個學生。 甚至我們所說的課桌,操場等等名詞都是代碼,用漢字來代表某個物體或者某種意義。代碼到底有什么好處 呢?方便于我們的溝通和交流。還是以我們的名字為例來說。如果一個人叫“張三”,那么我們有事情要找 他,那么就喊“張三”,叫張三的人就答應了,于是你可以跟他交流了。合同上要雙方簽字,而就是簽的名 字,合同簽完后就可以存檔了,不管經過多久,其他人看到這個簽字,就知道這是經過雙方本人認可了的, 而不需要雙方兩個大活人親自告訴你說,這個合同我認可了的,因為名字就代表了其本人。如果我們不用代 碼,那么一個合同文本上必須有兩個人站在那里,證明合同雙方都同意的,這是一件和荒唐的事情,文件柜 里站著兩個大活人不是很滑稽和不可能的事情嗎?所以,我們使用代碼。注意的是代碼就是代碼,不是人本 身,你的名字不等于你這個人本身,它僅僅代表你這個人,我們不能說幾個漢字和活生生的人是一樣的吧。 每個人都有血有肉,有情感,但是漢字只是一些筆跡,不會有血肉。
代碼,有任意性,就是我們可以用任何的東西來代表某個含義,如漢字里的“桌子”和英語里 的“desk“都是代表了同一種東西。這也表示這我們可以用隨意的什么來代表我們每個人,我們的名字是漢 字,兩個或者三個或者四個漢字,當然,我們也可以用數字來代表我們每個人,比如監獄里每個囚犯都有一 個編號,這個編號就是用十進制數來給每個人的代碼。雖然代碼有隨意性,但是我們一般不會隨意的進行編 寫代碼,而是按照某種規律來編碼,因為有規律的代碼使我們的維護更加方便。我們每個人的身份證就是一 個代碼,是很有規律的,不知道有沒有注意到這個規律。
代碼就是用碼字來代替,我們編寫代碼的過程叫做編碼,有時候也稱代碼為編碼。我們可以用 0 和 1
的二進制數按照某種規律排列起來代表任何一個事物,下面講幾種常用的代碼。 二——十進制代碼
二——十進制代碼就是用二進制數對十進制數編寫代碼,也就是說用 0 和 1 來給十進制數的 10 個數
碼 0~9 進行編碼,也稱為 BCD 碼。接下來我們就看代碼是如何進行編寫的,需要多少位二進制數來進行編 碼。表 3 列舉了 1~4 位二進制數所能進行的編碼個數,從中我們可以 知道,最少需要 4 位二進制數來進行編碼。
表 3 1~4 位二進制數所能進行的編碼個數
位數 |
1 位二進制數 |
2 位二進制數 |
3 位二進制數 |
4 位二進制數 |
代碼 |
0 1 |
00 01 10 11 |
000 001 010 011 100 101 110 111 |
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 |
代碼數目 |
2 21 |
4 2 2 |
8 2 3 |
16 2 4 |
從表 3 中可以看到,有 N 位二進制數,那么代碼的數量就是 2 N ,我們這里有 0~9 共計 10 個數,需要
多少位呢?3 位二進制數有 8 個代碼,10 個數不夠分,4 位二進制數有 16 個代碼,還多了 6 個呢,我們怎 么辦?我們可以想,如果有 10 個人來你家作客,如果你恰好有 10 張椅子還算好說,可是如果我們的椅子 不是恰好 10 把呢,你是提供 8 把椅子讓 2 個客人站著還是提供 16 把椅子讓椅子有空余呢?自然是提供 16 把椅子。多出來的 6 把椅子就讓他空著吧。
我們在前面講了,代碼的編寫具有隨意性,也就是說你可以隨意的編寫你自己的代碼,我們有 16 個 代碼,給 10 個數進行編碼,那么有多少種編碼的方案呢?數學上問題就是從 16 個數里面取出 10 個數進行 全排列,計算的結果是大約有 10 億種。這 10 億種方案都是二——十進制代碼,不過我們不可能用那么 多,代碼的編寫雖然有隨意性,但我們進行編碼不是自己一個人用的,還需要和別人交流,那么編寫一個有 規律的和通用性的代碼是必須的。理論上有無限種可能,但實際我們只使用其中的幾種。那么我們常用的都 是哪種代碼呢?最常用的就是 8421BCD 碼了。這種編碼的每位都有一個權值,恰好與自然二進制數的前
10 個數據相同,即用 0000(0)~1001(9)來表示十進制數的 0~9,從高位到低位的權值分別是
8,4,2,1,所以就稱作 8421BCD 碼。在 8421BCD 碼中,每組二進制數各位按照加權系數展開便是它
所對應的十進制數。如 8421BCD 碼的 0110 安權展開為
0110=0X8+1X4+1X2+0X1=6
所以 8421BCD 碼 0110 表示十進制數 6。 這里一定要注意代碼和我們前面講的十進制數轉換為二進制數相區別,對于同一個數,兩種運算結果
是不一樣的,例如十進制數 12,如果轉換為對應的二進制數,那么結果是 1100 ,而如果轉換為
8421BCD 碼,那么結果為 0001 0010,也就是說,8421BCD 碼就是嚴格的按照一位十進制數對應著 4 位二進制數來寫,2 位十進制數,必然對應著 8 位二進制數,他們之間只有我們在進行 8421BCD 碼編寫的 時候給的對應關系,12 和 0001 0010 沒有數值上的任何關系。
BCD 碼還有 5421 碼、余 3 碼等等,大家可以看看數字電子技術的教材,我不一一的講解了。
ASCII 碼
ASCII 碼(美國標準信息交換碼),適用于所有的拉丁文字母,被國際標準化組織(ISO)批準為國 際標準,稱為 ISO646 標準。我國相應的國家標準是 GB1988-80(即《信息處理交換用的七位編碼字符 集》)。這里的 GB 讀作“guo biao”(國標)而不是兩個英文字母 ”G“ ”B“。ASCII 碼 規定了信息交換用的
128 個字符。每個字符用 b7b6b5b4b3b2b1 七位來標識,通常最高位用 0 表示,使用 7 位二進制數來表 示所有的大寫和小寫字母,數字 0 到 9、標點符號, 以及在美式英語中使用的特殊控制字符。表 4 是 7 位
的 ASCII 碼表。
表 4 7 位的 ASCII 碼表
|
對于 ASCII 碼,我們不要去記憶什么,只需要知道如何查看就好。
漢字編碼
GB 2312 是一個簡體中文字符集的中國國家標準,全稱為《信息交換用漢字編碼字符集基本集》, 又稱為 GB0,由中國國家標準總局發布,1981 年 5 月 1 日實施。GB2312 編碼通行于中國大陸;新加坡 等地也采用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持 GB 2312。
GB 2312 標準共收錄 6763 個漢字,其中一級漢字 3755 個,二級漢字 3008 個;同時,GB
2312 收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的 682 個全角字
符。
GB 2312 的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸
99.75%的使用頻率。
對于人名、古漢語等方面出現的罕用字,GB 2312 不能處理,這導致了后來 GBK 及 GB 18030 漢 字字符集的出現。
GB 2312 中對所收漢字進行了“分區”處理,每區含有 94 個漢字/符號。這種表示方式也稱為區位
碼。
01-09 區為特殊符號。
16-55 區為一級漢字,按拼音排序。
56-87 區為二級漢字,按部首/筆畫排序。
10-15 區及 88-94 區則未有編碼。
舉例來說,“啊”字是 GB2312 之中的第一個漢字,它的區位碼就是 1601。 對于漢字編碼,我們也不需要去管它,自然有計算機幫我們處理與之相關的問題,從信息處理的角度
來看,漢字處理也是非數值處理,和英文字母一樣,需進行編碼才能被計算機處理。 同樣的,今天我們在計算機中所看到的每一樣東西,包括圖片、聲音、視頻等等都需要編碼,也只有
進行了編碼,我們才能在計算機中進行處理。我們的計算機不僅處理數值數據,還要處理大量的非數值數
據,而實際上,處理非數值數據要多的多。關于圖片、聲音、視頻等的編碼不是我今天的主題,請查閱相關
的專業書籍。
后記
上周有單片機課,講到了二進制數,課堂上比較激動,下課后考慮到 09 級的學生在這個學期數電 、C 語言、單片機同時上課,對于二進制數可能會有理解上的難題,便決定把課堂上的講課思路寫下來,于是 就有了這篇文章。從上周四到現在,除開中間有其他的雜事,一共用了 2 天的時間寫完。主要講解了二進 制、十進制、十六進制的相互轉換,帶符號數的補碼表示方法,編碼的概念以及 8421BCD 碼,ASCII 碼, 簡單的介紹了漢字的編碼。對于八進制數,進制轉換時小數的處理,因為我覺得這些不是最主要的,知道了十六進制數那么八進制數也就沒什么困難了,至于小數的進制轉換,原理和整數一樣,在后續的學習中很少使用,所以不講,上課的時候跟著老師聽一遍就會的。補碼運算,溢出沒有過多的講解,因為這部分理解上 有些困難,等這個學期結束了,再來看這兩個問題比較好。我在寫的時候就在不斷的思考如何講才能讓學生逐步的,遞進的理解,我是盡力的按照上課的時候講 課思路來寫的,語言也差不多是平時的用詞,沒有使用很正規的語法。有時候我發覺自己的思維有些跳躍,也不知道學生們能不能看懂這篇文章,如果有任何的問題,請告訴我,我的site:http://m.zg4o1577.cn/,歡迎提出疑問和建議。也歡迎你們把它分發到電子系其他班級同學那里,讓大家得到方便。本文章不希望被轉載,也不希望在沒有得到我同意的情況下被任何刊物發表以及網站轉載,但你可以 隨意的下載閱讀。除了大約 500 字是從百度上搜索得到以及圖片掃描了其他教材的外,其他的文字都是我 逐字逐句的敲進去的,請尊重我的版權,下載后請保持原樣,不要作任何修改,版權屬于作者本人。
阿州
2010 年 9 月 12 日星期日
本文pdf格式的版本下載更便于閱讀:http://m.zg4o1577.cn/ziliao/file/二進制數及其他.pdf