首页 > 编程知识 正文

组合bcd码,cdx什么意思

时间:2023-05-06 06:51:49 阅读:124397 作者:1461

BCD码的种类BCD码分为权利码和权利码两种。 权利BCD码有8421码、2421码、5421码,其中8421码最常用。 BCD码没有3码、格雷码等权利。

8421密封舱代码

8421 BCD码是最基本、最常用的BCD码,与四位自然二进制码相似。 各位的权重是8、4、2、1,因此称为权利BCD码。 与4位自然二进制代码不同,仅使用了4位二进制代码中的前10组代码。 也就是说,在0000~1001中分别表示对应的十进制数,剩下的6组代码没有使用。

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相互称为反码。

剩下三码

剩下的三个代码是8421 BCD代码的每个代码组加上3(0011 )。 常用于BCD码的运算电路。

格雷码

Gray代码也称为循环代码,最基本的特性是相邻两组代码中只有一位数字不同,也称为单位距离代码。

Gray代码的编码方案有很多种,典型的Gray代码如下表所示。 从表中可以看出,该代码除了具有每单位距离代码的特征外,还具有以表示的对称轴为界,除去最上位互补反射,剩下的低位沿着对称轴呈镜像对称的反射特性。 利用该反射特性,可以容易地构成位数不同的格雷码。

BCD码的格式计算机中的BCD码,常用的有分离BCD码、组合BCD码两种格式。

分离BCD代码是指用1字节的后4位代码表示十进制的1位。 例如,公式82的存储格式如下:

__100___0010其中_表示无关的值。

组合BCD码是将2位的10进制数存储到1字节中的代码,例82的存储形式为10000010

由于BCD码算法的编码以四位二进制对表示,每十进制数表示一次,因此如果将此BCD码直接传递给计算机进行运算,计算机可能会始终将数作为二进制数进行运算,因此结果错误。 例: 3、用BCD码求38 49。

解决方法是在二进制加法的结果中采用'加6修正。 这种校正称为BCD调整。 即,将二进制加法的结果修正为BCD符号加法的结果,在添加了2位的BCD数的情况下,使用修正规则修正二进制加法的结果。 修改规则:

)1)如果将任意两个对应比特的BCD数相加的结果没有进位到高位,则只要得到的结果小于等于9就不需要修正; 如果得到的结果大于9小于16,则对所述位加6进行修改。

)2)如果两个相应比特的BCD的数目相加的结果,高阶比特有进位(即,结果等于或大于16 ),则该比特被加上6,并被校正。

)3)低位校正的结果,高位大于9时,高位加6进行校正

8421 BCD码例示了BCD码一一对应

例如,十进制123在BCD中表示为:0001 0010 0011

因为:进制的1用二进制表示的话是0001

十进制的二进制表示为0010

十进制的3用二进制表示为0011

BCD码与二进制数的不同:从123的二进制数应该用短的除法求出1111011可知,BCD码只是机械地用二进制数表示十进制的各位

压缩和未压缩的区别在于,BCD代码是8位,浪费的4位用0填充,压缩的BCD代码是4位,没有浪费

1个字节有8bit(8个0或1 ),因此1个字节存储4位BCD代码),其馀的则为0 ),从而实现未压缩

例如十进制123 :

未压缩代码00000001 00000010 00000011

压缩代码0001 0010 0011

将c语言压缩bcd代码# include stdio.h # include stdlib.h # include string.h/* *字符串转换为bcd代码。 这正好是偶数个数据,如果是奇数个数据,则分为左或右压缩bcd代码*/intasc _ TCD * wile (* src!=' ' ) { temp=*src; *dest|=() ) temp0xf ) 4; src; temp=*src; *dest|=(temp0xf ); src; est; } retur

n 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"); else printf("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] = ''; 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] = ''; 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 = %dn",str_len); printf("bcd_len = %dn",bcd_len); memset(bcd,0,bcd_len); memset(str,0,100); #if 0 printf("右靠n"); asc_to_bcd_right(bcd,str1,str_len); print_hex(bcd,bcd_len); right_bcd_to_asc(str,bcd,bcd_len); printf("str = %sn",str);#endif #if 1 printf("左靠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 = %sn",str);#endif return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。