Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过左移位将16位模式转移到另一个寄存器中_C - Fatal编程技术网

C 通过左移位将16位模式转移到另一个寄存器中

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

我正在用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 ...
我不知道如何拖拽每一个细节 此外,我知道当半字节大于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;nd=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); 
}