Преобразование однократного кодирования в обычный двоичный файл

Это не обычный вопрос «бинарный в 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

Решение

Вы можете использовать таблицу поиска …

/* 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);
3

Другие решения

Если это скомпилировано на процессоре ARM, вы можете просто сделать это:

result = 31 - __CLZ(number);

Если предположить, number это 32-bit one-hot > 0,

1

По вопросам рекламы [email protected]