2013-06-01 2 views
2

Я пытаюсь проверить бит в значении флагов, флаги которого могут быть объединены вместе. До сих пор я использую этотПроверка флаги бит

if ((someclass.flags | CONST_SOMEFLAG) == someclass.flags) 

, чтобы проверить, если его истинным или ложным, но есть более «элегантный» способ сделать это?

ответ

0

Это будет работать нормально, но это более принято использовать &:

if (flags & MASK) . . . 

Это, вероятно, потому, что на некоторые процессоры, проверяющие регистр для! = 0, быстрее, чем тестирование на равенство с сохраненным значением.

+0

Это может не работать, если 'sizeof (flags)> sizeof (long)', например 64-битное слово с 32-разрядной компиляцией. Причина, являющаяся результатом побитовой математики, будет оцениваться как «int», которая усечет биты верхнего порядка и, таким образом, оценит как «false». –

+0

См. Спецификацию c99, 6.3.1.8p2. Если два операнда бинарного оператора представляют собой два разных целочисленных размера, то меньший продвигается с сохранением значения до размера большего. –

+0

К сожалению, есть много компиляторов c89, которые не соответствуют требованиям. –

2

Использование побитовое ИЛИ для установки флагов, использовать побитовое И, чтобы проверить, как это:

if (someclass.flags & CONST_SOMEFLAG) ...

+2

Обратите внимание, что если для «SOMEFLAG» имеется более одного бита, это вернет «истинный», если какой-либо из битов будет установлен, тогда как код OP будет проверять, все ли установлены. – Potatoswatter

0

То, что вы хотите знать, если бит установлен флаг среди всех остальных, возможно, установить или снятые биты. Канонический способ сделать это, это побитовое и (&) тест для того ненулевая

if(someclass.flags & CONST_SOMEFLAG) 
+1

OP правильный. Он проверяет, не установит ли параметр флаг (итоговое) значение без изменений. – Potatoswatter

+1

Его оригинальный код будет работать нормально, это просто нетрадиционно. Если ORing маски со значением не изменяет значение, тогда устанавливаются биты маски (а остальные биты не надоедают или не тестируются). –

+0

@Potatoswatter: Да, вы правы. Я удалил неправильное утверждение. – datenwolf

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