首页 > 编程知识 正文

c语言bcd计算,bcd算法

时间:2024-04-24 11:43:21 阅读:334143 作者:HOFV

本文目录一览:

c语言bcd码转十进制

不知道我的理解对不对,这个问题,就是把一个整数还原成16进制数的表示方式,而这个十六进制数实际上表示的就是十进制数,所以我们只要把输入的数转换成十六进制表示就行了,但是有一个问题,其实需要注意的就是输入的时候10-15

其实是不能输入了,因为刚好就是A-F,所以不妨让输入值=16

=15

对于这个范围的数

其实只要两步就行了,第一,除以16取余数,对应的是各位上的数,除以16取整数商,对应的就是十位数,应该这样就可以

void

main(){

int

a;

cina;

if(a16||a153)cout"不符合输入规则"endl;

else{

int

c=a%16;

int

b=a/16;

int

abc=

b*10+c;

coutabcendl;

}

}

如何用c语言实现bcd码转十六进制数比如BCD码5(0101),怎么转成0x05??

#includestdio.h

#includestring.h

int main()

{

char a[20],b[5];

int i,result = 0,k = 1,j = 0;

printf("输入一个二进制数:n");

gets(a);

for(i = strlen(a)-1;i = 0;i --)

{

if(a[i] == '1') result += 1 (k-1); //如果是1,用1*位权

if(k == 4 || i == 0) //每四位计算一次结果(result)。

//如果到了最高位(i==0)不足四位(比如100 0000),也计算

{

switch(result)

{

case 10: b[j++]='A';break; //大于等于十转化成字母

case 11: b[j++]='B';break;

case 12: b[j++]='C';break;

case 13: b[j++]='D';break;

case 14: b[j++]='E';break;

case 15: b[j++]='F';break;

default: b[j++]=result + '0';break;

}

result = 0; //结果清零

k = 0; //表示位权的K清零

}

k ++; // 初始位权为1

}

b[j] = '';

printf("结果是:n");

for(i = strlen(b)-1;i = 0;i --)

printf("%c",b[i]);

printf("n");

return 0;

}

二进制数转换为BCD码的方法有哪些?

BCD码使用4位二进制数来表示十进制中0~9这10个数的数码。例如,十进制的237,其BCD码就是 0010_0011_0111 ,但是其二进制是 1110_1101 。

我们先来研究两个4位的BCD码相加的情况。设这两个BCD码对应的十进制是a,b,其中a,b∈{0,1,2,...,9}。此时只有3种情况:

也就是说:

第一种情况显然不需要再修正。

第二种情况,例如,5+8=13,我们希望得到BCD码是 0001_0011 ,但是运算结果 1101 ,因此如果我们加上了6,就可以得到正确结果: 1101 + 0110 = 0001_0011 。这是因为,十进制是逢十进一,但是4位BCD加法,在看作是二进制数做加法时,是逢十六进一。因此,如果结果是10≤a+b≤15,加上6以后就是16+0≤a+b+6≤16+5,此时因为逢十六进一的原因,就得到了结果 1_0≤[a+b+6]≤1_5 ,这个结果就是对的。

第三种情况,因为16≤a+b≤18,逢十六进一后,我们得到了 1_0≤[a+b]≤1_2 ,为了使结果正确,如果我们加上一个修正值6,就得到 1_6≤[a+b+6]≤1_8 ,从而结果也变得正确。

综上所述,如果两个BCD码相加:

考虑一个例子,比如 35+99=134。35和99的BCD码分别是 0011_0101 和 1001_1001 。先计算低4位: 0101 + 1001 = 1110 ,因为这个值大于9,因此加上6作为修正: 1110 + 0110 = 1_0100 。现在计算高四位,同时注意到还有一个进位: 0011 + 1001 + 0001 = 1101 ,这个值还是大于9,加上6,得到 1101 + 0110 = 1_0011 。因此最终结果是 1_0011_0100 ,这刚好就是134的BCD码。

我们之所以能够安全地加上进位,是因为BCD加法比照的就是十进制的加法,只不过前者是4位为一个单位,而后者是以1位数字作为一个单位。加上修正值后,BCD加法的进位就相当于十进制加法的进位。图示如下:

给定一个二进制数,要转BCD码。一个常用算法就是不断将该数除以10,以此依次分解出个位、十位、百位……上的数字,这些数字的4位二进制数就是对应的BCD。但是这样的算法需要不断做除法操作十分的麻烦。我们可以使用名为 加三左移法 来完成。

这个算法基于以下的事实:

一个n位二进制数 ,其展开是 如果使用秦九韶算法的嵌套形式写法,可以写成: 或者若令 则 如果使用这种形式,我们先计算的是 ,然后是 ,然后是 ,……,最后是 。

注意到 就是把 左移1位,这样就会在最右边空出一个位,之后再加 就是用 填充这个最低位,从而我们得到了 。不断左移,最终就能得到 ,现在我们来设计一个算法使得左移结束后能得到对应的BCD码。

设 是一个无限长的、初始状态为所有位都是0的理想寄存器, 是欲转换的数。我们使用下面的 归纳法 来构造证明我们通过不断左移最终能够得到存储在 中的 对应的BCD码:

由数学归纳原理,移动 len(h) 次后,我们最终可以得到 的BCD码。

作为一个例子,考虑使用该算法将 的二进制 1000_0110 转为BCD码:

现在, 已经全部移入,此时 的值就是 0001_0011_0100 ,它就是 的BCD码。

C语言的算法如下:

c语言 计算机 bcd码

(101001)BCD=29,

这是因为BCD编码是每4位二进制对应一位十进制数字,即10--2,1001--9

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