碼制——BCD碼(詳細,通俗易懂)

太多事情要忙,都好久沒更新了,廢話不多說開始吧!!!!

閱讀本文所需知識:進位制數轉換及運算。

碼制——BCD碼(詳細,通俗易懂)

圖片來源於網路

BCD碼的概念

百度定義:BCD碼(Binary-Coded Decimal‎)亦稱二進位制十進位制或二-十進位制程式碼。用4位二進位制數來度表示1位十進位制數從16位組合中取出的0~9這10個數碼。

例如:十進位制28用BCD碼錶示(0010 1000)

ps:

0010(2)1000(8)概念一目瞭然

它的作用是什麼?

BCD碼是二進位制和十進位制相互轉換編碼,這使二進位制與十進位制的轉換更加便捷,同時儲存數值的精確度,避免電腦作浮點運算所耗的時間。

因為計算機中資料都是用二進位制進行儲存,所以二進位制和十進位制需要相互轉換,它們轉換是比較麻煩的,然而BCD碼正好解決了這個問題。BCD碼把十進位制每一位用4位二進位制來表示。上面那個例子就是證明。

BCD碼分類

壓縮碼和非壓縮碼

壓 縮 碼:用4位二進位制數來表示一位十進位制數(例如:2(

0010

))

非壓縮碼:用8位二進位制數來表示1位十進位制數(例如:2(

0000 00010

))

那麼問題來了,為什麼不直接使用壓縮碼? 高效又節省空間。

ps:因為一個位元組是8位,而且每個資料所表示的長度不同。

有權碼和無權碼

有權碼:8421碼、2421碼、5421碼

無權碼:餘三碼、餘三迴圈碼、格雷碼

碼制——BCD碼(詳細,通俗易懂)

圖片來源於網路

有權碼

8421碼

8421碼是BCD碼最常用的編碼方式,也被稱為BCD碼。

位權如名:8、4、2、1 (表示範圍:0~9(0000~1001),禁用碼:10~16(1010~1111)

例如:

543D = 0101 0100 0011B (ps:D表示十進位制數;B表示二進位制數)

8421碼對應ASICC碼的第四位相同,這特點有利於簡化輸入輸出過程中BCD碼和字元程式碼的轉換。

2421碼(自補特性)加權碼

位權:2、4、2、1

例如:642D=1100 0100 0010B

問題來了,仔細觀察位權裡有兩個2,這樣就會重複問題,比如說:0101和1011都對應5。

所以做出規定:0101~1010不許用

禁用碼:0101、0110、0111、1000、1001、1010

2421碼是對9的自補程式碼(自補性)

即每一個2421碼只要與自身按位取反,便可得到該數9的補數的2421碼。

例如:0100(4)即各位取反後正好為該數9的補碼1011(5)。

而0101取反後1010對應十進位制10顯然不滿足自補碼的要求。

好處:給運算帶來方便,因為可以利用其對9的補數將減法運算轉變為加法運算

(0000)和(1111)、 (0001)和(1110)、 (0010)和(1101)、 (0011)和

(1100)、 (0100)和(1011)互為反碼,仔細觀察它們具有反射特性

做加法是若兩個數之和為10正好等於二進位制的16(0001+1111=16),於是便能高位自動產生進位訊號。

5421

位權:5、4、2、1

注意位權不同表示的數也不同,看上面的例子相信你們也能理解了。

禁止碼:0101、0110、0111、1101、1110、1111

5421碼同樣也有2421碼的自補性。

碼制——BCD碼(詳細,通俗易懂)

真值表

無權碼

餘三碼

餘三碼是在8421碼基礎上+0011(3)(比如:8421碼0+0011(3)=0011)

表示範圍:3~12(0011~1100)

禁 用 碼 :0~2(0000~0010)、13~16(1101~1111)

那麼它的作用及特點是什麼?

餘三碼同樣也有對

9的自補性

,0和9, 1和8,…。。5和4的餘3碼互為

反碼

,這在求對於10的補碼很方便。

兩個餘3碼錶示的十進位制數相加時,能產生正確的進位訊號,但對“和”必須修正。

修正方式:

如果有進位訊號則結果+0011(3),如果沒有進位訊號則結果減0011(3)

例如:

碼制——BCD碼(詳細,通俗易懂)

有進位需修正 所以結果0010+ 0011(餘三碼3)= 2(轉換十進位制) 2+上進位10=12(結果正確)

ps:當兩個十進位制數的和是10時,相應的

二進位制編碼

正好是16,於是可自動產生進位訊號,而不需修正,

餘3碼常用在BCD碼運算電路中。

不懂的看下面的真值表對應,理解格雷碼再理解餘三迴圈碼。

格雷碼

8421>>>格雷碼

推理方式:異或法(相同為0,相異為1)如圖

碼制——BCD碼(詳細,通俗易懂)

特點:任何兩個相鄰的碼字僅有一位不同(不懂看真值表)

作用:雖然自然二進位制碼可以直接由數/模轉換器轉換成模擬訊號,但在某些情況,例如從十進位制的3轉換為4時二進位制碼的每一位都要變,使數位電路產生很大的尖峰電流脈衝。但是如果只有一個觸發器發生改變的話,那麼這些模糊狀態就不會出現。

比如:數字7(0111)轉8(1000),二進位制要每一位都要改變,而格雷碼的話只需要改變一位7(0100)轉8(1100)。

碼制——BCD碼(詳細,通俗易懂)

格雷碼是一種具有反射特性和迴圈的單補自補程式碼,可靠性編碼,使錯誤最小化的編碼方式

迴圈和單步特性

消除了隨機取數時出現重大錯誤的可能。

反射和自補特性

使得對其進行求反操作也非常方方便。

仔細觀察格雷碼的編碼方式,檢視其最大數碼和最小數碼,它們兩者仍然具有“兩個碼字中僅有一位程式碼不同”的特點,那麼也可以認為它們也是相鄰的,因此,格雷碼也稱為

迴圈碼。(變權碼)

仔細觀察16個4位格雷碼

從上往下依次讀出格雷碼的最後一位:0110 0110 0110 0110;

再從上往下依次讀出格雷碼的倒數第二位:0011 1100 0011 1100;

再從上往下依次讀出格雷碼的正數第二位:0000 1111 1111 0000;

看出規律了嗎?它這種特性稱為

“反射特性”

Ps:資料(0、1)在計算機中都是由儲存器進行儲存又被稱為暫存器,暫存器一般情況下觸發器來儲存,一個觸發器只能儲存一個二進位制數(0和1),也就是說如果需要儲存四位格雷碼就需要四個觸發器進行儲存。

餘三迴圈碼(變權碼)

8421碼>>格雷碼>>>餘3迴圈碼(餘3碼基礎上)

取自4位典型格雷碼的3~12這10個程式碼(即0~9的餘3迴圈碼0010~1010),此乃“餘3”之意

仍具有格雷碼的優點:兩個相鄰的程式碼只有一位碼元改變(大大減低錯誤的機率)。

注意:同一個8位二進位制程式碼表示的數,當認為它表示的是二進位制數和認為它表示的是二進位制編碼的十進位制數時,數值是不相同的。

例如:00011000,當把它視為二進位制數時,其值為24;但作為2位BCD碼時, 其值為18。

BCD碼與二進位制之間的轉換不是直接進行的, 當需要將BCD碼轉換成二進位制碼時,要先將BCD碼轉換成十進位制碼,然後再轉換成二進位制碼; 當需要將二進位制轉換成BCD碼時,要先將二進位制轉換成十進位制碼,然後再轉換成BCD碼。

如果有錯誤的地方望指出,一起交流學習討論。