0

这不是一个常规的“二进制到 bcd”问题,事实上,我不太确定如何称呼我正在尝试做的事情!

嵌入式设备中有一个字节以下列格式存储数字 1 到 7(一周中的几天):

00000001 = 1
00000010 = 2
00000100 = 3
00001000 = 4
00010000 = 5
00100000 = 6
01000000 = 7

我想读取这个字节,并将其内容(1 到 7)转换为 BCD,但我不确定如何执行此操作。

我知道我可以用一系列 if 语句来暴力破解它:

if(byte == B00000001) 
{
    answer = 1; 
}
else
if(byte == B00000010) 
{
    answer = 2; 
}

等等,但我认为可能有更好的方法。该数据存储在实时时钟上的单个寄存器中。我通过执行 I2C 读取来获取此字节,并将其读入程序中的一个字节。此实时时钟的数据表指定此特定寄存器的格式如我上面所述。

4

3 回答 3

3

您可以使用查找表...

/* this is only needed once, if lut is global or static */
unsigned char lut[65];
lut[1]=1;
lut[2]=2;
lut[4]=3;
lut[8]=4;
lut[16]=5;
lut[32]=6;
lut[64]=7;

...
...
...

/* Perform the conversion */
answer = lut[byte];

或者你甚至可以使用一些数学......

answer = 1 + log(byte)/log(2);
于 2014-01-19T02:19:13.150 回答
2

如果这是在 ARM 处理器上编译的,您可以简单地执行以下操作:

result = 31 - __CLZ(number);

假设number是一个32-bit one-hot > 0

于 2016-12-08T22:57:10.473 回答
0

您可以使用按位和模运算来有效地执行此操作,而无需创建大型数组

for (int answer = 1; (byte % 2) == 0; ++answer) {
    byte >>= 1;
}

(我知道这是一个老问题,我只是想分享一下,因为这对我来说是一个很高的谷歌结果)

于 2020-03-08T17:07:57.193 回答