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