Это не обычный вопрос «бинарный в 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, и я читаю его в байт в моей программе. Таблица данных для этих часов реального времени указывает, что этот конкретный регистр отформатирован, как я обрисовал выше.
Вы можете использовать таблицу поиска …
/* 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);
Если это скомпилировано на процессоре ARM, вы можете просто сделать это:
result = 31 - __CLZ(number);
Если предположить, number
это 32-bit one-hot > 0
,