2013-03-28 2 views
0
gcc 4.7.2 
c89 

Здравствуйте,сравнивающие битовые операторы

enum message_e { 
    SIP_CONNECTED = 1 << 0, 
    CALL_ACCEPTED = 1 << 1 
}; 

Установка битов в разных частях моего кода:

channel->base.message |= CALL_ACCEPTED; 
channel->base.message |= SIP_CONNECTED; 

Позже я хочу, чтобы проверить, чтобы убедиться, что оба бита:

if((channel->base.message & SIP_CONNECTED) && (channel->base.message & CALL_ACCEPTED)) { 
    /* IF BOTH BITS ARE SET CALL_ACCEPTED and SIP_CONNECTED */  
} 

Я только хочу провалить утверждение if если ТОЛЬКО эти биты установлены. Если CALL_ACCEPTED установлен, а SIP_CONNECTED - нет, и наоборот.

Однако, похоже, он попадает в оператор if, если установлен только один из них.

Большое спасибо за любые предложения,

+2

Каковы значения этих параметров? – cnicutar

+1

Что-то не так с вашей программой не в коде, который вы опубликовали. –

+2

Предполагая, что это разные битовые множества, которые не имеют перекрытия, этот код является правильным. Каковы значения этих бит-масок? – WhozCraig

ответ

1

Вы проверить CALL_ACCEPTED и SIP_CONNECTED макросъемки они конфликтуют друг с другом, например:?

CALL_ACCEPTED is 0x01 and SIP_CONNECTED is 0x11. 

После кода:

channel->base.message |= CALL_ACCEPTED; 
channel->base.message |= SIP_CONNECTED; 

channel->base.message = 0x11; 

So if((channel->base.message & SIP_CONNECTED) && (channel->base.message & CALL_ACCEPTED)) всегда верный. Это мой анализ

+0

Моя ошибка, см. Мой вопрос совершить выше. – ant2009

+0

@ ant2009, хорошо, и вы установили channel-> base.message в ноль, прежде чем устанавливать эти флаги? Возможно, перед тем, как вы установите эти флаги, у него уже есть эти флаги. – MYMNeo

0

Его двоичное И оператор &, что требуется. & & является логическим и оператором.

if((channel->base.message & SIP_CONNECTED) & (channel->base.message & CALL_ACCEPTED)) { 
+0

Почему бы логично И не работать? В этом случае немного мудрая операция будет совершенно противоположной. – Amit

1

Код корректен

код в if выполняется только если обе CALL_ACCEPTED установлен и SIP_CONNECTED установлен

может быть до того, как проверка вы сделали у вас есть ошибки в коде и CALL_ACCEPTED или SIP_CONNECTED правильно не установлен

проверка непосредственно перед if, что оба CALL_ACCEPTED и SIP_CONNECTED установлены правильно.

Вы можете проверить его отладки или с printf

+0

Моя ошибка увидеть мой вопрос совершить выше – ant2009

+0

Ничего не изменилось в вопросе?! – MOHAMED

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