BCD码详解
目錄
1、BCD碼的種類
1. 8421 BCD碼
2. 5421 BCD碼和2421 BCD碼
3. 余3 碼
4. Gray碼(格雷碼)
2、BCD碼的格式
3、BCD碼的運算法則
4、8421 BCD碼舉例說明
5、壓縮與非壓縮
6、C語言壓縮bcd碼
1、BCD碼的種類
BCD碼可分為有權碼和無權碼兩類:有權BCD碼有8421碼、2421碼、5421碼,其中8421碼是最常用的;無權BCD碼有余3碼、格雷碼等。
1. 8421 BCD碼
8421 BCD碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的權值為8、4、2、1,故稱為有權BCD碼。和四位自然二進制碼不同的是,它只選用了四位二進制碼中前10組代碼,即用0000~1001分別代表它所對應的十進制數,余下的六組代碼不用。
2. 5421 BCD碼和2421 BCD碼
5421 BCD碼和2421 BCD碼為有權BCD碼,它們從高位到低位的權值分別為5、4、2、1和2、4、2、1。這兩種有權BCD碼中,有的十進制數碼存在兩種加權方法,例如,5421 BCD碼中的數碼5,既可以用1000表示,也可以用0101表示;2421BCD碼中的數碼6,既可以用1100表示,也可以用0110表示。這說明5421BCD碼和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 碼
余3碼是8421 BCD碼的每個碼組加3(0011)形成的。常用于BCD碼的運算電路中。
4. Gray碼(格雷碼)
Gray碼也稱循環碼,其最基本的特性是任何相鄰的兩組代碼中,僅有一位數碼不同,因而又叫單位距離碼。
Gray碼的編碼方案有多種,典型的Gray碼如下表所示。從表中看出,這種代碼除了具有單位距離碼的特點外,還有一個特點就是具有反射特性,即按表中所示的對稱軸為界,除最高位互補反射外,其余低位數沿對稱軸鏡像對稱。利用這一反射特性可以方便地構成位數不同的Gray碼。
2、BCD碼的格式
計算機中的BCD碼,經常使用的有兩種格式,即分離BCD碼,組合BCD碼。
所謂分離BCD碼,即用一個字節的低四位編碼表示十進制數的一位,例如數82的存放格式為:
_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示無關值。
組合BCD碼,是將兩位十進制數,存放在一個字節中,例82的存放格式是10000010
3、BCD碼的運算法則
由于編碼是將每個十進制數用一組4位二進制數來表示,因此,若將這種BCD碼直接交計算機去運算,由于計算機總是把數當作二進制數來運算,所以結果可能會出錯。例:用3、BCD碼求38+49。
解決的辦法是對二進制加法運算的結果采用"加6修正,這種修正稱為BCD調整。即將二進制加法運算的結果修正為BCD碼加法運算的結果,兩個兩位BCD數相加時,對二進制加法運算結果采用修正規則進行修正。修正規則:
(1)如果任何兩個對應位BCD數相加的結果向高一位無進位,若得到的結果小于或等于9,則該不需修正;若得到的結果大于9且小于16時,該位進行加6修正。
(2)如果任何兩個對應位BCD數相加的結果向高一位有進位時(即結果大于或等于16),該位進行加6修正.
(3)低位修正結果使高位大于9時,高位進行加6修正
4、8421 BCD碼舉例說明
BCD碼是一一對應的
如:十進制的123 用BCD表示為:0001 0010 0011
因為:十進制的 1 用二進制表示是 0001
? ? ? ? ?十進制的 2 用二進制表示是 0010
? ? ? ? ?十進制的 3 用二進制表示是 0011
BCD碼和二進制的區別:123的二進制應該用短除法求得1111011由此可見,BCD碼只是機械地用二進制表示十進制的每一位
5、壓縮與非壓縮
區別就是BCD碼是8位的,浪費4位用0填充,壓縮的BCD碼是4位的,沒有浪費
由于1字節有8bit(8個0或1)如果用一字節存儲4位BCD碼(其余補0)就是非壓縮
如十進制的123:
非壓縮碼? 00000001 00000010 00000011
壓縮碼? 0001 0010 0011
6、C語言壓縮bcd碼
#include<stdio.h> #include<stdlib.h> #include<string.h>/* * 字符串轉成bcd碼,這個是正好偶數個數據的時候,如果是奇數個數據則分左靠還是右靠壓縮BCD碼 */ intasc_to_bcd(char * dest,const char *src) {unsigned char temp;while(*src !='\0'){temp = *src;*dest |=((temp&0xf)<<4);src++;temp = *src;*dest |= (temp&0xf);src++;dest++;}return 0; }intasc_to_bcd_right(char *dest,const char *src,int src_len) {unsigned char temp;if((src_len %2) !=0){*dest &= 0;temp = *src;*dest |= (temp&0xf);src++;dest++;}asc_to_bcd(dest,src);return 0; }intasc_to_bcd_left(char *dest,const char *src,int src_len) {unsigned char temp;if((src_len %2) !=0){dest[src_len-1] &=0;}asc_to_bcd(dest,src);return 0; }voidprint_hex(char * bcd,int len) {int i=0;for(i=0;i<len;i++){int n = 8;while(n--){if((bcd[i] &(0x1<<n))==0)printf("0");elseprintf("1");}putchar('\n');} }intbcd_to_asc(char *dest,const char *src,int src_len) {unsigned char temp;char *t = dest;while(src_len--){*t |= ((*src&0xf0)>>4);*t++ |= 0x30;*t |= (*src&0xf);*t++ |= 0x30;src++;}return 0; }intleft_bcd_to_asc(char *dest,const char * src,int src_len) {bcd_to_asc(dest,src,src_len);dest[src_len*2 -1] = '\0';return 0; }intright_bcd_to_asc(char *dest,const char * src,int src_len) {bcd_to_asc(dest,src,src_len);memmove(dest,dest+1,src_len*2-1);dest[src_len*2-1] = '\0';return 0; }int main(void) {char str[100];char *str1 = "1234567";int str_len = strlen(str1);int bcd_len = (str_len+1)/2;char *bcd = (char *)malloc(bcd_len);printf("str_len = %d\n",str_len);printf("bcd_len = %d\n",bcd_len);memset(bcd,0,bcd_len);memset(str,0,100);#if 0printf("右靠\n");asc_to_bcd_right(bcd,str1,str_len);print_hex(bcd,bcd_len);right_bcd_to_asc(str,bcd,bcd_len);printf("str = %s\n",str); #endif#if 1printf("左靠\n");asc_to_bcd_left(bcd,str1,str_len);print_hex(bcd,bcd_len);//memset(str,0,100);left_bcd_to_asc(str,bcd,bcd_len);printf("str = %s\n",str); #endifreturn 0; }?
?
?
總結
- 上一篇: c语言基础回顾 —— 其他知识点
- 下一篇: 五大板块(1)—— 数组的定义,赋值与应