2016-12-04 5 views
0

я 11 флагов определяются как:Наиболее эффективный способ проверить, если флаги устанавливаются в целом

#define F1 1 
#define F2 2 
#define F3 3 
#define F4 4 
... 
#define F11 11 

В какой-то функции, то я создаю целое число, которое может включать в себя любой из этих флагов, например:

int a = (1 << F1) | (1 << F5) | (1 << F11) | (1 << F8); 

Это затем передается в функцию, которая должна декодировать, какие флаги установлены для того, чтобы устанавливать определенные биты в определенных регистрах. Поэтому мой вопрос: какой наиболее эффективный способ проверить, какие флаги установлены. Сейчас у меня есть 11, если:

void foo(int a) 
{ 
    if ((a & (1 << F1)) >> F1) { 
     // Set bit 5 in register A. 
    } 

    if ((a & (1 << F2)) >> F2) { 
     // Set bit 3 in register V. 
    } 

    if ((a & (1 << F3)) >> F3) { 
     // Set bit 2 in register H. 
    } 

    if ((a & (1 << F4)) >> F4) { 
     // Set bit 1 in register V. 
    } 

    // And so on, for all 11 flags. 
} 

P.S. Это для 8-разрядного микроконтроллера.

+0

@ M.M Да, вы правы. Я починил это. – user1806687

ответ

2

Просто используйте:

typedef enum{ 
    FLAG1 = 1, // or 0x01 
    FLAG2 = 2, 
    FLAG3 = 4, 
    ... 
    FLAG8 = 0x80 
} flags; 

Затем в основном просто проверить

if(value & FLAGN) 

В C нет разностного между 1 и любым другим числом, если заявлением. Он просто проверяет, является ли нулевое или ненулевое число.

и установка та же:

value = FLAG1 | FLAG2 | FLAG8; 

Вы также можете использовать OFC определяет.

И для claryfication максимальное количество флагов для типа N бит равно N. Поэтому вам нужно иметь больший тип (если компилятор поддерживает более крупные типы данных), например uint16_t.

2

if заявления и логические операторы языка C не делают разницы между 1 и другими не-нулями (хотя логические операторы производят 1 для true). Поэтому нет никакой разницы между (a & (1 << F3)) >> F3 и a & (1 << F3) в контексте логического выражения: если оценивать до true, то и другой, и наоборот. Следовательно, это должно работать:

if (a & (1 << F1)) { 
    // Set bit 5 in register A. 
} 

Примечание: Я предполагаю, что ты не хотел писать #define F11 1024, а скорее #define F11 10, потому что вы используете F S в качестве второго операнда <<.

 Смежные вопросы

  • Нет связанных вопросов^_^