[英]transfer 16 bit pattern into another register by left shifting
我打算在 C 中实现双 dabble 算法以执行二进制到 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 上吗? 然后左移原始寄存器?
并最终得到他最终的 BCD 结果
BCD (Binary)
100s Tens Ones Original
0010 0100 0011 11110011
我不知道如何拖动每个单独的位我也知道当半字节大于 4 时我必须添加 3,但也许掩码可以完成这项工作。我将在 7 段显示中显示从 0000 到的四位数字当寄存器为 1111 1111 1111 1111 时,我将通过将 16 位 resgiter 乘以一个常数来获得 3000 的最大值,从而获得 3000。
感谢您的建议
这是一个简单的解决方案。 main()
以十六进制显示结果(必须对应于初始十进制整数)。
注意:您可以用任何未签名的 integer 类型替换所有unsigned
的。 例如uint16_t
用于 16 位 integer (不要忘记#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: %x\n", x, double_dabble(x));
}
或者,这里是将 integer 转换为 BCD 的简单方法(不使用双涉算法)。 它使用 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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.