寫在前面的話:
大二上學期初修該課程,本以為相對於通訊而言該課程不重要,學的並不紮實,好多重要的知識點沒有搞明白,但是隨著學習的進展,發現該課程是一切硬體電路的基礎,如芒在背,所以於大二下學期暑假中重新學習,有幸在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。