數位電路一:緒論—資訊—編碼

淺草寺的光影發表於2020-07-30

 寫在前面的話:

 

大二上學期初修該課程,本以為相對於通訊而言該課程不重要,學的並不紮實,好多重要的知識點沒有搞明白,但是隨著學習的進展,發現該課程是一切硬體電路的基礎,如芒在背,所以於大二下學期暑假中重新學習,有幸在b站上找到王紅主講的清華大學《數位電子技術》 50講視訊教程,特此整理聽課筆記及回憶一些重點提醒後來者。

視訊課程連結(視訊質量挺高的記得給作者投個幣):https://www.bilibili.com/video/BV16x411i7FW 

緒論

 進入正題:

首先

電子電路的作用→處理資訊

             ↓ 

       能量轉換

 

 

 其中訊號可以由數字訊號與模擬訊號構成,分別對應數電與模電。(鄭益慧老師的模電有機會也整個專題,講的也真的好)

從而數電是用離散電壓來表示資訊,以實現資訊傳遞與控制。

 

編碼

 

一:編碼的規範

遵循:唯一性,效率性(如資料結構中的哈夫曼編碼),可靠性,安全性。

 

 二:編碼的數制與碼制

數制:表示數量的規則(十進位制,二進位制,八進位制,十六進位制等等)

如:(重點問題:進位制之間的轉化規則)

 

部分捷徑:

十進位制下2000的二進位制表示為:011111010000

011/111/010/000每三位讀取換算為八進位制:3720

0111/1101/0000每四位讀取換算為十六進位制:7d0(也寫作0x7d0)

可以直接利用位數讀取,以此類推每5位讀取對應32進位制,每6位讀取對應64進位制等等(只適合二的倍數進位制間的轉化)

 

而十進位制的99對應1/100/011對應八進位制的143可以一眼看出,十六進位制也可一眼看出,但從二進位制返回十進位制只能一位一位加公式為:D=ΣKi•Ni   

 

再著重強調一類特殊情況:

不同進位制間小數的轉化:

 

十進位制小數轉換成N進位制小數採用“乘N取整”法。具體做法為:

用N乘以十進位制小數,可以得到一個積,這個積分整數部分和小數部分;

將積的整數部分取出寫好,再用N乘以餘下的小數部分,又得到一個新的積;

再將積的整數部分取出,繼續用N乘以餘下的小數部分;

……

如此反覆進行,每次都取出整數部分寫到小數點後,再用N接著乘以小數部分,直到積中的小數部分為0,或者達到所需要的精度為止。

 

 

 圖源網路,侵刪。

 

我們已經瞭解到進位制的事項

那麼如何直接進行二進位制間的計算呢?

 

首先介紹三種編碼方式:原碼,反碼,補碼。

 

一:原碼

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符號位             數值部分

比如:[14]10=[1110]2=0  1110

         [-14]10=[-1110]2=1  1110

(其中正數符號位為0,負數符號位則為1) 

 

原碼的兩大缺點:

第一:0的表示有兩種表示方法,正零與負零表示方式不同,這會導致有一個碼位被浪費,且不符合常理。

第二:不方便計算,如-5+5的結果為0 101+1 101=0 010 與實際情況不符,所以確實不方便直接計算。

 

為了解決這兩個缺點,我們先鋪墊一種碼制——反碼。

 

二:反碼

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符號位             數值部分:其中正數不變,負數每一位一次取反。

比如:[14]10=[1110]2=0  1110

         [-14]10=[-1110]2=1  0001

 

這便是反碼,同樣存在兩個設計缺陷:正零與負零表示方式不同及無法直接計算的問題。

 

 

我們為了解決這兩大缺陷重新設計了碼制————補碼(核心的核心)

三:補碼

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符號位             數值部分:其中正數採用原碼設計方式,負數取反後加一。

比如:[7]10=[0111]2=0  0111(正數與原碼一致)

         [-7]10=[-0111]2=1  1001(為7的原碼取反加一)

 

從而我們發現,7與-7相加,進位產生了溢位,使得7-7=0,解決了缺陷二

對於缺陷一:不論是正零還是負零,補碼錶示均為0   00....00 同樣解決了缺陷一

一種近乎完美的編碼法則,至此出現。

 

這是通過人類設計得到的,巧妙地解決了兩大缺陷,從而廣泛應用。

 

 

 

由於0的碼為補碼錶示為0   00....00,相對於負數而言,正數編碼位減少了一個。

這也就是c++中,int整型中的-2147483648~2147483647負數比正數範圍多了一個的原因,可見補碼用處範圍之廣,同樣也是挺有意思的。

 

 

碼制:表示事物的規則

 用不同數碼錶示不同事物時遵循的規則。(比如學號,車牌號等等)

 對於不同的實際問題選取不同的編碼規則來表示事物。

 

常見的編碼規則有一種叫BCD碼的

BCD碼也稱二進碼十進數,BCD碼可分為有權碼和無權碼兩類。其中,常見的有權BCD碼有8421碼、2421碼、5421碼,無權BCD碼有餘3碼、餘3迴圈碼、格雷碼。

 

 

 

 

這些編碼規則各有用途,每一種均有長處,當然我們知道,每獲取一些新的效能時,需要犧牲原有的部分優良效能,從而對於不同問題選擇不同編碼方式才是硬道理。

 

 

 

 

新的問題

 

問題一:

我們已經知道了補碼的樣子,那麼補碼的小數怎麼表示呢。

同樣是採取,取反加一的口訣。

如-2.625的補碼為:

首先將-2.625換算成小數樣子,1  010.101,除了符號位取反得1  101.010

在該列數的末尾加一即可得到補碼1  101.011

可見 ' 1 ' 不是數值上的1 ,而是為了使得與對應正數相加為零時,補的1。

 

 

P.S 補碼還有另外一種理解方式

 

符號位為負數,依次從該負數中減去每一位的數值含義,也可以得到換算關係。

 

 

如果想再深入思考補碼蘊含的數學原理,則可參考張子秋的    https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

其中對數學規則同餘的講解。

 

原創不易,轉載請註明出處 https://www.cnblogs.com/Shade-of-Greenland/p/13398854.html。

 

相關文章