今天FPGA的同事问我C语言中十进制转8421BCD码是用的什么方法?
第一时间我在想除了除10取余还能有什么办法?
过了一会儿,突然想起有没有办法从移位上解决这个问题呢?
于是乎就看到这个链接。
然后就用C语言实现了一下,代码如下(谁有兴趣话看看是取余计算快呢还是下面这种快,测完记得评论一下,谢谢):
#include <stdio.h>
unsigned int dec_to_bcd(unsigned int dec)
{
unsigned long int i = 0;
unsigned char c[8];
int cnt = 0;
int cnt4 = 0;
for (cnt=sizeof(dec)*8; cnt!=0; cnt--)
{
i <<= 1;
i |= ((dec >> (cnt - 1)) & 1);
if (cnt == 1)
break;
for (cnt4=0; cnt4<sizeof(c); cnt4++)
{
c[cnt4] = (i >> (cnt4 * 4)) & 0x0F;
c[cnt4] = c[cnt4] > 4 ? c[cnt4] + 3 : c[cnt4];
}
i = 0;
for (cnt4=0; cnt4<sizeof(c); cnt4++)
{
i |= ((c[cnt4] & 0x0F) << (cnt4 * 4));
}
}
return i;
}
int main(void)
{
unsigned int i = 12345678;
printf("%d=%X\n", i, dec_to_bcd(i));
return 0;
}