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