原碼 最高位表示符號,其他位表示數值,則這種表示方法就是原碼。如
[+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 碼, 簡單的介紹了漢字的編碼。對于八進制數,進制轉換時小數的處理,因為我覺得這些不是最主要的,知道了十六進制數那么八進制數也就沒什么困難了,至于小數的進制轉換,原理和整數一樣,在后續的學習中很少使用,所以不講,上課的時候跟著老師聽一遍就會的。補碼運算,溢出沒有過多的講解,因為這部分理解上 有些困難,等這個學期結束了,再來看這兩個問題比較好。我在寫的時候就在不斷的思考如何講才能讓學生逐步的,遞進的理解,我是盡力的按照上課的時候講 課思路來寫的,語言也差不多是平時的用詞,沒有使用很正規的語法。有時候我發覺自己的思維有些跳躍,也不知道學生們能不能看懂這篇文章,如果有任何的問題,請告訴我。也歡迎你們把它分發到電子系其他班級同學那里,讓大家得到方便。本文章不希望被轉載,也不希望在沒有得到我同意的情況下被任何刊物發表以及網站轉載,但你可以 隨意的下載閱讀。除了大約 500 字是從百度上搜索得到以及圖片掃描了其他教材的外,其他的文字都是我 逐字逐句的敲進去的,請尊重我的版權,下載后請保持原樣,不要作任何修改,版權屬于作者本人。
評論