首页天道酬勤十进制转8421码,二进制转十进制8421法

十进制转8421码,二进制转十进制8421法

张世龙 05-13 12:40 100次浏览

1. BCD码总数

BCD代码使用四位二进制数来表示十进制数字(0到9 )。 例如,十进制数字237表示BCD代码为0010_0011_0111,但二进制数字为1110_1101。

首先,让我们讨论将两个4位的BCD代码相加的情况。 设与这两个BCD码对应的十进制数为a,b,其中a,b{ 0,1,2,9}。 此时只有三种情况。

0a b9

10a b15

16a b18

也就是说:

在第一种情况下,结果本身就是对应的BCD代码。 例如,0100 0101=1001,即4 5=9;

在第二种情况下,结果对4位运算不发生进位,但结果超出了BCD码所表现的范围(因为4位BCD码最多表示9 )。 例如5 (8=13,0101 ) 1000=1101

在第三种情况下,结果不仅对4位运算产生进位,其结果也超出了BCD码所表示的范围。 例如,413=17,01001101=1_ 0001

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

在第二种情况下,例如,5(8=13 ),BCD代码为0001_0011,但运算结果为1101,因此将6相加可以获得正确的结果。 1101 0110=0001_0011。 这是因为,十进制都是十进制,而4位BCD加法在视为二进制进行加法运算时,都是十六进制。 因此,结果为10a b15,加上6等于160AB6165。 在这种情况下,由于所有十六进制数,将得到结果1_0[a b 6]1_5。 这个结果是正确的。

第三种情况是16a b18,因此到16进制数时,得到1_0[a b]1_2,为了正确结果,加上1个修正值6,则得到1 _ 6[

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

如果结果小于9,则不执行操作

如果结果大于9,则必须将6添加为校正值

请考虑一个例子。 例如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单位,后者以1位数字为1单位。 如果加上修正值,BCD加法的进位相当于十进制加法的进位。 图标如下所示。

2 .二进制转换BCD码

要指定二进制数,请转换为BCD代码。 一种常见算法是将数字除以10,从而按顺序分解1位、10位、100位……以上的数字,这些数字的4位的二进制数对应的BCD。 但是,在这种算法中,继续除法操作非常麻烦。 我们可以用加三左移法完成。

该算法基于以下事实:

一个数乘以2,相当于其二进制向左移位一位

如果将两个BCD代码相加,并且结果大于9,则必须将6作为修改

一个n位的二进制数

其开展情况如何

使用秦九韶算法嵌套格式的写法,可以写如下。

或者如果是命令的话

如果是

使用这样的形式,首先计算的是

然后

然后

、…、最后呢。

注意到了

那是

向左移动一位。 这样的话,最右边空出一位,之后再添加

是使用

通过填充这个最低有效位,我们可以。 继续向左移动,最终会得到

让我们设计算法,以便左移结束后获得相应的BCD代码。

设置

是无限长、初始状态所有位都为0的理想寄存器,

要转换的数量。 我们用以下归纳法来建立一个结构,证明我们可以通过继续向左移动来最终保存

的双曲正弦值

对应的BCD代码:

初始:

向左移动

我进去

经过几个运算,

里面是

r">的BCD码。这个显然是成立的,因为

是1位(不是0就是1,对应BCD码就是本身),将其左移进

后,

的值立即是

的BCD码

假设:设某一时刻,已经将

左移入

,通过若干运算后,此时

中是

的BCD码

归纳:现在准备移入

,我们希望这个步骤结束后,

的值是

的BCD码。因为此时

的BCD码,现在对

从最低位开始每四位作为一个单位

,即将

划分为

,设

,做如下处理:

如果从

开始之后全部为0,则过程结束

否则如果

,则转第4步

否则,令

,保留4位

,转第1步

为什么要加3呢?这是因为如果

,那么加法结果要加修正值6,也就是

,这等价于

;如果

,那么加法结果就不需要修正。此外,因为

目前本身就是BCD码,因此必然

,从而加3不会产生进位。如此处理后,将

左移一位,也就是乘以2,此时得到的就是

的BCD码。现在,因为乘以2的关系,

必然是偶数,故而BCD最低位的数值

,于是加上

后有

。从而,得到的就是

正确的BCD码。

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

的BCD码。

作为一个例子,考虑使用该算法将

的二进制1000_0110转为BCD码:

初始:R=..._0000_0000,h=1000_0110(下面使用#作为占位符)

R中的

均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0001,h=0000_110#

R中的

均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0010,h=0001_10##

R中的

均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0100,h=0011_0###

R中的

均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_1000,h=0110_####

R中的

,对其做加3处理得到R=..._0000_1011。R左移1位,h左移一位进入R:R=..._0001_0110,h=110#_####

R中的

,对其做加3处理得到R=..._0001_1001。R左移1位,h左移一位进入R:R=..._0011_0011,h=10##_####

R中的

均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0110_0111,h=0###_####

R中的

,对其都做加3处理得到R=..._1001_1010。R左移1位,h左移一位进入R:R=..._0001_0011_0100,h=####_####

现在,

已经全部移入,此时

的值就是0001_0011_0100,它就是

的BCD码。

C语言的算法如下:

#include

#define N 50

#define DIGITS_NUM 8*sizeof(byte_t)

typedef char byte_t;

byte_t regstr[N];

void resetRegstr(){

for(int i=0;i

}

void show8421bcd(){

int i=0;

for(i=0;i

if(regstr[i]!=0) break;

}

if(i==N) {

printf("0\n");

return;

}

for(;i

byte_t unit=regstr[i];

for(int j=0;j

printf("%d",(unit>>(4*(DIGITS_NUM/4-j-1)))&0xF);

}

}

printf("\n");

}

byte_t _processUnit(byte_t unit){

byte_t newval=0;

for(int j=0;j

int val=0xF&(unit>>(4*j));

newval|=(val+(val>4?3:0))<

}

return newval;

}

int to8421bcd(byte_t *num,int n){

resetRegstr();

for(int k=0;k

byte_t digit=num[k];

for(int i=DIGITS_NUM-1;i>-1;i--){

byte_t bi=(digit>>i)&0x1;

for(int j=N-1;j>-1;j--){

byte_t bi_=_processUnit(regstr[j]);

regstr[j]=(bi_<<1)|bi;

bi_=(bi_>>(DIGITS_NUM-1))&0x1;

if(bi_==1&&j==0) return 0;

bi=bi_;

}

}

}

return 1;

}

void main(){

byte_t nums[]={/*2,321,973,245,437,681,127 */

0x20,0x39,0x4E,0x5D,0x48,0x46,0x1D,0xE7

};

int ok=to8421bcd(nums,8);

if(!ok){

printf("something wrong...\n");

}else{

show8421bcd();

}

}

bcd码转换成ascii码,8421码到5421码的转换 c语言实现十进制转十六进制,十进制与bcd码之间的转换