1. 程式人生 > >數制和碼制(後期可能有更新)

數制和碼制(後期可能有更新)

mat 進位 clas sta 一定的 內部 .com n-1 大小

  數字電路是數字IC設計的基礎,而數制和碼制往往又是數字電路的基礎,因此數制和碼制是數字IC設計基礎的基礎。在這裏,我將記錄關於數制與碼制的一些主要知識點,有些知識點我是學了數電半年或者一年之後才發現,原來數電還有這樣子的東西,於是整理在這裏,僅供參考,有誤請評論指出。

一、數制

  這裏不進行記錄什麽二進制、十進制之類的基本概念,只介紹一些主要的知識點。

  1、數制之間的轉換

(1)關於二進制的一些概念

  這裏主要記錄一下位、比特對於二進制的描述,是比較基礎的東西。

  位寬/比特:一個二進制數,有它的位寬,有多少個0/1,它位寬就是多少;比如二進制數10110,它的位寬就是5,從第0位到第4位;也說這是一個5位寬的二進制數,或者說這個二進制數寬度大小是5比特,數值大小為22(默認數值大小一般說的是十進制的數值大小)。

  最高位和最低位:對於上面的10110,最高位是1,最低位是0;最高位是第4位,最低位是0

(2)二進制轉換成十進制:

  ①二進制轉換成十進制方法為:把二進制數按權展開、相加即得十進制數。

  ②舉例:二進制數10011.01,位數為1的有第4位,第1位,第0位,第-2位,那麽就有:

  10011的十進制數值(註意說到數值,默認是轉換為十進制時數的大小)為:2^4 + 2^1 + 2^0 + 2^(-2) = 19.25

十進制轉換成二進制:

  ①轉換方法就是:整數部分,除二取余;小數部分,乘二取整(小數部分一般會說明要精確到小數點多少位)。

  ②舉例說明:將35.63轉換成二進制數,小數部分精確到小數點後3位

  那麽對於整數部分,除二取余

        技術分享

整數部分的二進制數就是100011。

  對於小數部分:乘二取整

  0.63*2 = 1.26,取1;0.26*2 = 0.52,取0;0.52*2 = 1.04,取1;已經達到三位了。因此小數部分就是101

因此35.63的二進制表示為100011.101。

(3)二進制轉換成八進制:

   ①方法:從小數點向兩邊展開,每三位二進制劃分為一組,每一組的的十進制就是對應的八進制,(註意,最高位或者最低位不夠3位要補0)。

  ②舉例:1001.01轉換成八進制,進行分組 (00)1 001 . 01(0),轉換成八進制就是11.2。

八進制轉換成二進制:

  ①八進制轉換成二進制的方法跟二進制轉換成八進制的方法相反,一位八進制對應三位的二進制,依次展開就可以。

  ②舉例:八進制67.21轉換成二進制,6是110,7是111,2是010,1是001;所以對應的二進制就是110111.010001。

(4)二進制轉換成十六進制,十六進制轉換成二進制:

  二進制轉換成十六進制/十六進制轉換成二進制與八進制的類似,只不過是八進制對應的是3位,而十六進制對應的是4位;這裏不再詳述。

它們之間的轉換都可以通過二進制進行。

  2、二進制的有符號與無符號

(1)無符號數,也就是沒有正負之分,默認為正值,上面說到的都是正數,也就是無符號數。對於二進制也是這樣。

  ·一般情況下,沒有專門指出這個數是有符號的,就默認是無符號的數。

  ·n位無符號可以表示的範圍位0~+(2^n-1),即0~1...1

(2)有符號數,顧名思義就是有正負之分,比如+39,-49。對於二進制數而言,也有有符號數之分。以後我記錄的說到有符號數的,默認指有符號數的二進制數。

  在有符號的二進制數中,最高位表示符號位,其他位表示數的其他內容;其中符號位是1時,表示這個有符號的二進制數是負數;符號位是0時,表示這個有符號的二進制數是正數。

比如有符號數10010,最高位是1,表示這個二進制數是負數。(當然要註意下面要講到的反碼)

    ·從前面上述可以知道,一個有符號的二進制數,至少有兩位,其中一位是符號位

  有符號二進制數有三種表達方式原碼、反碼、補碼(十進制之類的也有補碼之類的,這裏僅僅記錄與二進制有關的)。

  ③原碼:最高位是符號位,除最高位後的二進制數,表示二進制數值的絕對值大小。

比如原碼100110,最高位是1,表示負數;剩余是00110,表示的數值大小是6,那麽這個原碼表示的數值大小就是-6 。

    ·一般情況下,說到是有符號數,一般指的是原碼。

    ·原碼的0,可以表示為+0和-0,也就是1...0,0..0,因此有兩種表達形式。

    ·n位原碼表示的範圍為:-(2^(n-1)-1)~+(2^(n-1)-1),即1...1~0...1

  ④反碼:反碼可以由原碼出發得來,將原碼的每一位都取反就得了對應的反碼。

  比如一個有符號數的原碼是10011,那麽這個有符號數的反碼就是01100.

·反碼在應用不多,也許是我還沒有了解到吧,在此不詳述,以後用到了再詳述記錄吧。

  ⑤補碼:補碼的應用就廣泛了,計算機的內部運算就是用補碼的。

  補碼也可以由原碼得來:

    對於正數:補碼即為補碼;

    對於負數:原碼的符號位不變,剩余位取反,然後整體加一就得到了補碼。

  比如:二進制的原碼是10010,符號位1不變;剩余0010,取反得1101;整合為11101,加一得到11110.也就是原碼是10010的補碼為11110 。

  ·補碼的0,假設有4位,那麽對於-0,原碼是1000,進行取反加一後,得到0000(假設位寬固定);對於+0,補碼也是0000;因此補碼的0只有一種表達形式

  ·n位補碼表示的數值範圍為:-2^(n-1)~+(2^(n-1)-1)

  

  3、二進制的加減運算與溢出現象

(1)二進制的加減運算

  ①對於一般的無符號運算,直接運算就好了,沒什麽可以說的。但是計算機內部,它是用補碼運算的,這就有可以記錄的地方了,補碼的加減運算對於其他的有符號數,就顯得比較簡單了。此外,減法也可以當成加法來,減一個數可以當成加這個數的負數。

  ②對於補碼的加法運算有:補碼 + 補碼 = 補碼。當然這個是有一定的條件的,下面舉例探討。

  ③例一:(+3) + (+4),結果顯然是+7;用二進制補碼進行運算,則是0011+0100,得到的結果是0111,很顯然,0111是+7的補碼。

例二:(-2) -6 = (-2)+ (-6),結果顯然是-8;用二進制補碼進行運算,則是1110 + 1010 ,得到11000,這個很顯然也是-8的補碼。

例三:+6 - 3 = (+6)+ (-3),結果顯然是+3;用二進制補碼進行運算,則是0110+1101,結果是10011,誒呀,這個很顯然就不是+3的補碼,但是,當我們去掉最高位後,只看低四位0011,這個很顯然是+3的補碼呀。

例四:+4-7 = (+4)+(-7),結果是顯然是-3;用二進制補碼進行運算,則是0100+1001,得到的結果是1101,這個結果很顯然是-3的補碼。

(2)溢出現象

 ①經過上面的四個例子,引入溢出這個概念:如果加法操作產生的幾個超出了數制定義的範圍,就說發生了溢出。兩個異號數相加,肯定不會溢出;同號相加可能溢出。

  ②判斷溢出的法則:如果加數的符號相同,而和的符號與加數符號不同,則有加法溢出。

  ③再談前面的四個例子:

一般而言,對於位寬固定的情況下,

    例一相加,得到的是4位,沒有溢出,結果也正確。

    例二,雖然得到的結果正確,但是得到的結果是5位的,如果截去最高位,那麽得到結果將是錯誤的,也就是有溢出產生。這裏也提醒我們,對於同號相加,要加多一位,其實也就是加多一個進位位。

    例三結果雖然是不正確的,但是這是5位的結果,我們截去最高位,這個結果是對的,因此這個沒有溢出,也就是這個結果(四位)還是對的。

    例四,沒有溢出。

二、編碼

第二篇記錄一下編碼。

  編碼:用於表示不同的數或其他事件的一組n位二進制碼的集合,稱為一種編碼。

  碼字:一個含義確切的特定的n位組合,稱為碼字。

總之可以這麽理解,編碼就是一種表達二進制數集合的方式。

1、十進制數的二進制編碼

  ①十進制數的二進制編碼也就是用二進制表示10個十進制數0~9

  ②十進制數的二進制編碼方式主要有:BCD碼,也叫8421碼;5421碼;2421碼;余3碼。下面是表格,但是這裏值簡述一下8421碼;2421碼;余3碼。

      技術分享

  ③8421碼:如上圖所示,是最習慣用二進制表示十進制數的一種方式。最高位的值是8,次高位是4,次低位是2,最低位是1 。因此一個二進制數1001表示的數值就是1*8+1*1 = 9 。也就是按權展開就是十進制數值了。

  ④2421碼:數值小於等於4時,2421碼等於8421碼;數值大於4時等於8421碼加6 。

  ⑤余3碼:8421碼加上0011就對應數值的余3碼。

2、格雷碼

(1)概念:百度百科是這樣說的:在一組二進制數的編碼中,若任意兩個相鄰的二進制數只有一位二進制數不同,則稱這種編碼為格雷碼。

·由於最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼或反射碼

(2)二進制與格雷碼的相互轉換:這裏的二進制不是只BCD碼,就是自然的二進制。

①二進制轉換為格雷碼:

轉換方法:

  自然二進制的最高位與格雷碼的最高位相同;然後從最低邊一位起,依次將每一位與左邊一位進行比較,相同取0,不同取1,(也就是異或運算)作為對應格雷碼該位的值。

舉例比較方便:

  110010轉換成格雷碼:

過程圖:

    技術分享

首先最高位是1,那麽格雷碼最高位是1;然後從最低位起跟左邊一位進行比較;

最低位是0,它的左邊一位是1,因此得到格雷碼的最低位是1;

次低位是1,它的左邊一位是0,因此得到次低位的格雷碼是1;

次次低位0,它的左邊一位是0,因此得到次次低位的格雷碼是0;

...

次高位是1,它的左邊一位是1(也就是最高位),因此格雷碼的次高位是0;

這樣就得到格雷碼:101011 。

②格雷碼轉二進制碼:

轉換方法:

  這個轉換方類似,只不過是倒著回來;同樣保留格雷碼的最高位作為自然二進制碼的最高位,而次高位自然二進制碼為最高位自然二進制碼與次高位格雷碼相異或(就是那個相同取0,不同取1),而自然二進制碼的其余各位與次高位自然二進制碼的求法相類似。

舉例吧:

  把格雷碼101101轉換成二進制數:

過程圖:

    技術分享

轉換過程不再詳述。

(3)格雷碼的特點

百度百科總結如下:

  ①格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式。

  ·自然二進制碼可以直接由數/模轉換器轉換成模擬信號,但在某些情況,例如從十進制的3轉換為4時二進制碼的每一位都要變,能使數字電路產生很大的尖峰電流脈沖。

  ·格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減少了由一個狀態到下一個狀態時邏輯的混淆。

  ·由於格雷碼相鄰的兩個碼組之間只有一位不同,因而在用於方向的轉角位移量-數字量的轉換中,當方向的轉角位移量發生微小變化(而可能引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。

  ②格雷碼是一種絕對編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,它的循環、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。

   ③格雷碼是一種變權碼,每一位碼沒有固定的大小,很難直接進行比較大小和算術運算,也不能直接轉換成液位信號,要經過一次碼變換,變成自然二進制碼,再由上位機讀取。

  ④典型格雷碼是一種采用絕對編碼方式的準權碼,其權的絕對值為2^i-1(設最低位i=1)。

  ⑤格雷碼的十進制數奇偶性與其碼字中1的個數的奇偶性相同。

3、ASCII碼

(1)簡介

  ASCII(American Standard Code for Information Interchange美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統。

(2)一個ASCII碼用8位二進制表示。

  只記錄這些,詳情自己Google或者百度吧。

4、其他編碼

  其他的編碼,如奇偶校驗碼、循環冗余檢驗碼(CRC)、漢明碼、二維碼、NRZ編碼、霍夫曼編碼、曼徹斯特編碼等等這些編碼在以後應用到的時候,再進行記錄。

數制和碼制(後期可能有更新)