2015-12-04 7 views
-1

Мне интересно, как лучше всего справляться с несколькими флагами, например, у меня есть 5 флагов, которые мне нужно проверить: t d y r g, и мне нужно проверить все случаи таких флагов. Что такое лучший способ сделать это вместо того,Работа с несколькими флагами

if(t && d && y && r && g) {} 
else if(t && d && y && r) {} 
else if(t && d && y && g) {} 
.... 
else if(t) {} 
else if(d) {} 
+0

Зачем вам нужно проверить определенные комбинации флагов в первую очередь? Разве это недостаточно, чтобы обрабатывать их индивидуально? – zapl

ответ

2

Вы можете преобразовать флаги отдельных битов и выполнять бинарные операции над ними.

Предположим, есть пять флагов: a, b, c, d и e.
Допустимые значения для всех флагов: 0x1 и 0x0.

  1. Измени uint8_t:

    uint8_t flags; 
    flags |= a; 
    flags |= b << 0x1; 
    flags |= c << 0x2; 
    flags |= d << 0x3; 
    flags |= e << 0x4; 
    flags |= f << 0x5; 
    

    Если вы сохранили все флаги в массиве с самого начала и обозначим их через макросы в качестве индексов, как это:

    #define IGNORE_CASE 0x0 
    ... 
    
    bool flag_array[NUM_FLAGS]; 
    
    flag_array[IGNORE_CASE] = SOME_VALUE; 
    

    процесс преобразования всей может быть упрощена до цикла.

  2. Теперь вы можете удобно сравнить конкретные бит-маски.

    Чтобы проверить a и b установлены, используйте

    if (flags & (0x1 + 0x2)) 
    

    Чтобы проверить b и f установлены, используйте

    if (flags & (0x2 + 0x20)) 
    

    уборщик путь будет определять макросы или константы для флаговые бит-маски и использовать эти макросы, а не простые шестнадцатеричные битовые маски.

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