BCD码详解
目錄
1、BCD碼的種類
1. 8421 BCD碼
2. 5421 BCD碼和2421 BCD碼
3. 余3 碼
4. Gray碼(格雷碼)
2、BCD碼的格式
3、BCD碼的運(yùn)算法則
4、8421 BCD碼舉例說(shuō)明
5、壓縮與非壓縮
6、C語(yǔ)言壓縮bcd碼
1、BCD碼的種類
BCD碼可分為有權(quán)碼和無(wú)權(quán)碼兩類:有權(quán)BCD碼有8421碼、2421碼、5421碼,其中8421碼是最常用的;無(wú)權(quán)BCD碼有余3碼、格雷碼等。
1. 8421 BCD碼
8421 BCD碼是最基本和最常用的BCD碼,它和四位自然二進(jìn)制碼相似,各位的權(quán)值為8、4、2、1,故稱為有權(quán)BCD碼。和四位自然二進(jìn)制碼不同的是,它只選用了四位二進(jìn)制碼中前10組代碼,即用0000~1001分別代表它所對(duì)應(yīng)的十進(jìn)制數(shù),余下的六組代碼不用。
2. 5421 BCD碼和2421 BCD碼
5421 BCD碼和2421 BCD碼為有權(quán)BCD碼,它們從高位到低位的權(quán)值分別為5、4、2、1和2、4、2、1。這兩種有權(quán)BCD碼中,有的十進(jìn)制數(shù)碼存在兩種加權(quán)方法,例如,5421 BCD碼中的數(shù)碼5,既可以用1000表示,也可以用0101表示;2421BCD碼中的數(shù)碼6,既可以用1100表示,也可以用0110表示。這說(shuō)明5421BCD碼和2421 BCD碼的編碼方案都不是惟一的,表1-2只列出了一種編碼方案。
上表中2421 BCD碼的10個(gè)數(shù)碼中,0和9、1和8、2和7、3和6、4和5的代碼對(duì)應(yīng)位恰好一個(gè)是0時(shí),另一個(gè)就是1。就稱0和9、1和8互為反碼。
3. 余3 碼
余3碼是8421 BCD碼的每個(gè)碼組加3(0011)形成的。常用于BCD碼的運(yùn)算電路中。
4. Gray碼(格雷碼)
Gray碼也稱循環(huán)碼,其最基本的特性是任何相鄰的兩組代碼中,僅有一位數(shù)碼不同,因而又叫單位距離碼。
Gray碼的編碼方案有多種,典型的Gray碼如下表所示。從表中看出,這種代碼除了具有單位距離碼的特點(diǎn)外,還有一個(gè)特點(diǎn)就是具有反射特性,即按表中所示的對(duì)稱軸為界,除最高位互補(bǔ)反射外,其余低位數(shù)沿對(duì)稱軸鏡像對(duì)稱。利用這一反射特性可以方便地構(gòu)成位數(shù)不同的Gray碼。
2、BCD碼的格式
計(jì)算機(jī)中的BCD碼,經(jīng)常使用的有兩種格式,即分離BCD碼,組合BCD碼。
所謂分離BCD碼,即用一個(gè)字節(jié)的低四位編碼表示十進(jìn)制數(shù)的一位,例如數(shù)82的存放格式為:
_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示無(wú)關(guān)值。
組合BCD碼,是將兩位十進(jìn)制數(shù),存放在一個(gè)字節(jié)中,例82的存放格式是10000010
3、BCD碼的運(yùn)算法則
由于編碼是將每個(gè)十進(jìn)制數(shù)用一組4位二進(jìn)制數(shù)來(lái)表示,因此,若將這種BCD碼直接交計(jì)算機(jī)去運(yùn)算,由于計(jì)算機(jī)總是把數(shù)當(dāng)作二進(jìn)制數(shù)來(lái)運(yùn)算,所以結(jié)果可能會(huì)出錯(cuò)。例:用3、BCD碼求38+49。
解決的辦法是對(duì)二進(jìn)制加法運(yùn)算的結(jié)果采用"加6修正,這種修正稱為BCD調(diào)整。即將二進(jìn)制加法運(yùn)算的結(jié)果修正為BCD碼加法運(yùn)算的結(jié)果,兩個(gè)兩位BCD數(shù)相加時(shí),對(duì)二進(jìn)制加法運(yùn)算結(jié)果采用修正規(guī)則進(jìn)行修正。修正規(guī)則:
(1)如果任何兩個(gè)對(duì)應(yīng)位BCD數(shù)相加的結(jié)果向高一位無(wú)進(jìn)位,若得到的結(jié)果小于或等于9,則該不需修正;若得到的結(jié)果大于9且小于16時(shí),該位進(jìn)行加6修正。
(2)如果任何兩個(gè)對(duì)應(yīng)位BCD數(shù)相加的結(jié)果向高一位有進(jìn)位時(shí)(即結(jié)果大于或等于16),該位進(jìn)行加6修正.
(3)低位修正結(jié)果使高位大于9時(shí),高位進(jìn)行加6修正
4、8421 BCD碼舉例說(shuō)明
BCD碼是一一對(duì)應(yīng)的
如:十進(jìn)制的123 用BCD表示為:0001 0010 0011
因?yàn)?十進(jìn)制的 1 用二進(jìn)制表示是 0001
? ? ? ? ?十進(jìn)制的 2 用二進(jìn)制表示是 0010
? ? ? ? ?十進(jìn)制的 3 用二進(jìn)制表示是 0011
BCD碼和二進(jìn)制的區(qū)別:123的二進(jìn)制應(yīng)該用短除法求得1111011由此可見(jiàn),BCD碼只是機(jī)械地用二進(jìn)制表示十進(jìn)制的每一位
5、壓縮與非壓縮
區(qū)別就是BCD碼是8位的,浪費(fèi)4位用0填充,壓縮的BCD碼是4位的,沒(méi)有浪費(fèi)
由于1字節(jié)有8bit(8個(gè)0或1)如果用一字節(jié)存儲(chǔ)4位BCD碼(其余補(bǔ)0)就是非壓縮
如十進(jìn)制的123:
非壓縮碼? 00000001 00000010 00000011
壓縮碼? 0001 0010 0011
6、C語(yǔ)言壓縮bcd碼
#include<stdio.h> #include<stdlib.h> #include<string.h>/* * 字符串轉(zhuǎn)成bcd碼,這個(gè)是正好偶數(shù)個(gè)數(shù)據(jù)的時(shí)候,如果是奇數(shù)個(gè)數(shù)據(jù)則分左靠還是右靠壓縮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; }?
?
?
總結(jié)
- 上一篇: c语言基础回顾 —— 其他知识点
- 下一篇: 五大板块(1)—— 数组的定义,赋值与应