这不是一个常规的“二进制到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读取来获取此字节,并在程序中将其读入一个字节。该实时时钟的数据表指定此特定寄存器的格式如上所述。
答案 0 :(得分: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);
答案 1 :(得分:1)
如果在ARM处理器上编译它,您只需执行此操作:
result = 31 - __CLZ(number);
假设number
是32-bit one-hot > 0
。
答案 2 :(得分:0)
您可以利用按位和模运算来有效地做到这一点,而无需创建大型数组
for (int answer = 1; (byte % 2) == 0; ++answer) {
byte >>= 1;
}
(我知道这是一个老问题,我只想分享一下,因为这对我来说是Google的一项高评价)