分類
BCD碼可分為
有權碼和無權碼兩類:有權BCD碼有8421碼、2421碼、5421碼,其中8421碼是最常用的;無權BCD碼有餘3碼,餘3循環碼等。
8421
8421 BCD碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的
權值為8、4、2、1,故稱為有權BCD碼。和四位自然二進制碼不同的是,它只選用了四位二進制碼中前10組代碼,即用0000~1001分別代表它所對應的
十進制數,餘下的六組代碼不用。
5421和2421
5421 BCD碼和2421 BCD碼為有權BCD碼,它們從高位到低位的權值分別為5、4、2、1和2、4、2、1。這兩種有權BCD碼中,有的十進制數碼存在兩種
加權方法,例如,5421 BCD碼中的數碼5,既可以用1000表示,也可以用0101表示;2421 BCD碼中的數碼6,既可以用1100表示, 也可以用0110表示。這說明5421 BCD碼和2421 BCD碼的編碼方案都不是惟一的,表1-2隻列出了一種編碼方案。
上表中2421 BCD碼的10個數碼中,0和9、1和8、2和7、3和6、4和5的代碼對應位恰好一個是0時,另一個就是1。就稱0和9、1和8互為
反碼。
餘3 碼
餘3碼是8421 BCD碼的每個碼組加3(0011)形成的。常用於BCD碼的運算電路中。
餘3循環碼
餘3循環碼是無權碼,即每個編碼中的1和0沒有確切的權值,整個編碼直接代表一個數值。主要優點是相鄰編碼只有一位變化,避免了過渡碼產生的“噪聲”。
Gray碼
Gray碼也稱
循環碼,其最基本的特性是任何相鄰的兩組代碼中,僅有一位數碼不同,因而又叫單位距離碼。
Gray碼的編碼方案有多種,典型的Gray碼如下表所示。從表中看出,這種代碼除了具有單位距離碼的特點外,還有一個特點就是具有反射特性,即按表中所示的
對稱軸為界,除最高位互補反射外,其餘低位數沿對稱軸鏡像對稱。利用這一反射特性可以方便地構成位數不同的Gray碼。
編碼方式
最常用的BCD編碼,就是使用"0"至"9"這十個數值的二進碼來表示。這種編碼方式,在稱之為“
8421碼”(日常所說的BCD碼大都是指8421BCD碼形式)。除此以外,對應不同需求,各人亦開發了不同的編碼方法,以適應不同的需求。這些編碼,大致可以分成有權碼和無權碼兩種:
有權BCD碼,如:8421(最常用)、2421、5421…
無權BCD碼,如:餘3碼、
格雷碼…(注意:格雷碼並不是BCD碼)
以下為三種常見的BCD編碼的比較。
十進數 8421-BCD碼 餘3-BCD碼 2421-A碼
(M10) DCBA C3C2C1C0 a3a2a1a0
0 - 0 0 0 0 / 0 0 1 1 / 0 0 0 0
1 - 0 0 0 1 / 0 1 0 0 / 0 0 0 1
2 - 0 0 1 0 / 0 1 0 1 / 0 0 1 0
3 - 0 0 1 1 / 0 1 1 0 / 0 0 1 1
4 - 0 1 0 0 / 0 1 1 1 / 0 1 0 0
5 - 0 1 0 1 / 1 0 0 0 / 1 0 1 1
6 - 0 1 1 0 / 1 0 0 1 / 1 1 0 0
7 - 0 1 1 1 / 1 0 1 0 / 1 1 0 1
8 - 1 0 0 0 / 1 0 1 1 / 1 1 1 0
9 - 1 0 0 1 / 1 1 0 0 / 1 1 1 1
常用BCD碼
十進制數 | 8421碼 | 5421碼 | 2421碼 | 餘3碼 | 餘3循環碼 |
0 | 0000 | 0000 | 0000 | 0011 | 0010 |
1 | 0001 | 0001 | 0001 | 0100 | 0110 |
2 | 0010 | 0010 | 0010 | 0101 | 0111 |
3 | 0011 | 0011 | 0011 | 0110 | 0101 |
4 | 0100 | 0100 | 0100 | 0111 | 0100 |
5 | 0101 | 1000 | 1011 | 1000 | 1100 |
6 | 0110 | 1001 | 1100 | 1001 | 1101 |
7 | 0111 | 1010 | 1101 | 1010 | 1111 |
8 | 1000 | 1011 | 1110 | 1011 | 1110 |
9 | 1001 | 1100 | 1111 | 1100 | 1010 |
-----------------------
特點
5421碼和2421碼中大於5的數字都是高位為1,5以下的高位為0。
餘3碼是8421碼加上3,有上溢出和下溢出的空間。
舉例
某二進制無符號數11101010,轉換為三位
非壓縮BCD數,按百位、十
位和個位的順序表示,應為<U>__C</U>__。
A.00000001 / 00000011 / 00000111 B. 00000011 / 00000001 / 00000111
C.00000010 / 00000011 / 00000100 D. 00000011 / 00000001 / 00001001
(2)按百位、十位和個位的順序表示,應為<U>__C</U>__。
附註:
壓縮BCD碼與
非壓縮BCD碼的區別—— 壓縮BCD碼的每一位用4位二進制表示,一個位元組表示兩位
十進制數。例如10010110B表示十進制數96D;非壓縮BCD碼用1個位元組表示一位十進制數,高四位總是0000,低4位的0000~1001表示0~9.例如00001000B表示十進制數8.
BCD碼的運算法則
BCD碼的運算規則:BCD碼是十進制數,而運算器對數據做加減運算時,都是按二進制運算規則進行處理的。這樣,當將 BCD碼傳送給運算器進行運算時,其結果需要修正。修正的規則是:當兩個BCD碼相加,如果和等於或小於 1001(即
十進制數9),不需要修正;如果相加之和在 1010 到1111(即十六進制數 0AH~0FH)之間,則需加 6 進行修正;如果相加時,本位產生了進位,也需加 6 進行修正。這樣做的原因是,機器按
二進制相加,所以 4 位
二進制數相加時,是按“逢十六進一”的原則進行運算的,而實質上是 2 個十進制數相加,應該按“逢十進一”的原則相加,16 與10相差 6,所以當和超過 9或有進位時,都要加 6 進行修正。下面舉例說明。
【例 1.3】 需要修正 BCD碼運算值的舉例。
(1) 計算 5+8;(2) 計算 8+8
解:(1) 將 5 和 8 以 8421 BCD輸入機器,則運算如下:
0 1 0 1
+) 1 0 0 0
1 1 0 1 結果大於 9
+) 0 1 1 0 加 6 修正
1 0 0 1 1 即13 的 BCD碼
結果是 0011,即
十進制數3,還產生了進位。5+8=13,結論正確。
(2)將8以8421 BCD輸入機器,則運算如下:
1 0 0 0
+)1 0 0 0
1 0 0 0 0產生進位
+)0 1 1 0 加6修正
1 0 1 1 0 16的BCD碼
結果是0110,即
十進制的6,而且產生進位。8+8=16,結論正確。
微機原理代碼: (AL=BCD 5,BL=BCD 8) 設AH=0,則
ADD AL,BL
AAA
結果為 AX=0103H,表示非壓縮
十進制數,CF=1,AF=1,AH=1,AL=3
使用AAA指令,可以不用禁止高半位元組,只要在相加後立即執行AAA指令,便能在AX中得到一個正確的非壓縮十進制數