我正在用C语言实现双达贝算法,以执行二进制到BCD表示法。我用的是pic16f876a。我不确定,但我想没有默认的操作来做这件事,所以我想以这种方式一次从原始寄存器转移/左移一位到另一位:
0000 0000 0000 11110011 Initialization
0000 0000 0001 11100110 < Left Shift
0000 0000 0011 11001100 <Left Shift
0000 0000 0111 10011000 < Left Shift
add 3 to nibble with 7/111 result ...
我将从创建16位寄存器开始我应该屏蔽原始数字的MSB并将其放在另一个寄存器的LSB上吗?然后lef移位原始寄存器?
并最终得到他的最终BCD结果
BCD (Binary)
100s Tens Ones Original
0010 0100 0011 11110011
我不知道如何拖动每一点此外,我知道当半字节大于4时,我必须加3,但也许掩码可以完成任务。当寄存器为1111111111111111时,我将在7段显示中显示从0000到3000的四位数字。
感谢的建议
或者,这里有一种将整数转换为BCD的简单方法(不使用double-damble算法(。它使用sprintf+strtod:
unsigned to_BCD(unsigned x) {
char s[20]; // enough even for 64-bits integers !
sprintf(s, "0x%u", x);
return (unsigned) strtod(s, NULL);
}
这里有一个简单的解决方案。main()
以十六进制显示结果(必须与初始十进制整数相对应(。
注意:您可以用任何无符号整数类型替换所有unsigned
。例如,对于16位整数的uint16_t
(不要忘记#include <stdint.h>
(
#include <stdio.h>
unsigned double_dabble(unsigned x) {
unsigned r = 0, mask, d;
int k = 0, nibbles, n, bit;
for(mask = 1 << (sizeof(x) * 8 - 1); mask; mask >>= 1) {
nibbles = (++k + 3) / 4;
for(n = 0; n < nibbles; n++) {
d = r & (0b1111 << (n * 4));
if (d > (4 << (n * 4)))
r += 3 << (n * 4);
}
bit = ((x & mask) != 0);
r = (r << 1) | bit;
}
return r;
}
int main() {
unsigned x = 0b11110011; // 423
printf("x: %d -> BCD: %xn", x, double_dabble(x));
}