簡體   English   中英

通過左移將 16 位模式轉移到另一個寄存器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM