C 通过左移位将16位模式转移到另一个寄存器中
我正在用C实现双涉猎算法,以执行二进制到BCD表示法。我用的是pic16f876a。我不确定,但我想没有默认的操作来执行此操作,因此我希望以这种方式将原始寄存器中的一位一次转移/左移到另一位:C 通过左移位将16位模式转移到另一个寄存器中,c,C,我正在用C实现双涉猎算法,以执行二进制到BCD表示法。我用的是pic16f876a。我不确定,但我想没有默认的操作来执行此操作,因此我希望以这种方式将原始寄存器中的一位一次转移/左移到另一位: 0000 0000 0000 11110011 Initialization 0000 0000 0001 11100110 < Left Shift 0000 0000 0011 11001100 <Left Shift 0000 0000 0111 1001100
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 ...
我不知道如何拖拽每一个细节
此外,我知道当半字节大于4时,我必须加3,但可能掩蔽可以完成这项工作。我将在7段显示中显示4位数字,从0000到3000。当寄存器为1111111111111111时,我将通过将16位的resgiter乘以常数得到最大3000
感谢您的建议这里有一个简单的解决方案。
main()
以十六进制显示结果(必须与初始十进制整数相对应)
注意:您可以将所有无符号
替换为任何无符号整数类型。例如,uint16\u t
表示一个16位整数(不要忘记\include
)
#包括
无符号双数据块(无符号x){
无符号r=0,掩码,d;
int k=0,半字节,n,位;
对于(掩码=1>=1){
半字节=(++k+3)/4;
对于(n=0;n d=r&(0b1111)(4或者,这里有一种将整数转换为BCD的简单方法(不使用双dabble算法)。它使用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);
}
10Q太多了,所有人都复习了。祝你一周愉快。
#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));
}
unsigned to_BCD(unsigned x) {
char s[20]; // enough even for 64-bits integers !
sprintf(s, "0x%u", x);
return (unsigned) strtod(s, NULL);
}