2014-01-19 1 views
0

Это не обычный вопрос «двоичный код для bcd», на самом деле я не совсем уверен, что назвать то, что я пытаюсь сделать!Конвертировать одноразовое кодирование в обычный двоичный файл

Существует один байт во встроенном устройстве, которое хранит цифры от 1 до 7 (по дням недели) в следующем формате:

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

Я хочу прочитать этот байт и преобразовать его содержимое (От 1 до 7) в BCD, но я не уверен, как это сделать.

Я знаю, что я мог бы просто перебором его с серией если заявления:

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

и так далее, но я думаю, что может быть лучше. Эти данные хранятся в одном регистре на часах реального времени. Я получаю этот байт, выполняя чтение I2C, и я прочитал его в байте в своей программе. Техническое описание для этих часов реального времени указывает, что этот конкретный регистр отформатирован, как я изложил выше.

+2

Вы пробовали что-нибудь? –

+0

Я знаю, что я мог бы просто перетащить его с помощью следующих утверждений if (byte == 00000001) answer = 1; if (byte == 00000010) answer = 2; и т. д., но я думаю, что может быть лучший способ. Эти данные хранятся в одном регистре на часах реального времени – user3211203

+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); 
+0

Я даже не использовал логарифмы! Похоже, это будет проще всего реализовать, спасибо! – user3211203

+0

С другой стороны, поскольку я работаю над встроенной системой, скорость очень важна. Знаете ли вы, какой из перечисленных выше методов будет быстрее для 8-разрядного 16-мегагерцового процессора? У меня такое чувство, что вычисление 2 логарифмов и деление займет больше времени, чем поисковая таблица – user3211203

+0

@ user3211203 взгляните на ссылку, которую я оставил на ваш вопрос. Речь идет о самом быстром способе вычисления целочисленных логарифмов base-2. –

0

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

result = 31 - __CLZ(number); 

Предполагая number является 32-bit one-hot > 0.