2013-03-28 116 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 2013-03-28 09:40:09

+1

无论您的程序出现什么问题,都不在您发布的代码中。 – 2013-03-28 09:40:41

+2

假设这些是不重复的不同位集,这个代码是正确的。这些口罩的价值是什么? – WhozCraig 2013-03-28 09:41:17

回答

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; 

所以if((channel->base.message & SIP_CONNECTED) && (channel->base.message & CALL_ACCEPTED)) 总是如此。那是我的分析

+0

我的错误看到我的问题提交上面。 – ant2009 2013-03-28 10:04:30

+0

@ ant2009,好的,你可以在设置这些标志之前将channel-> base.message设置为零?也许在设置这些标志之前,它已经有了这些标志。 – MYMNeo 2013-03-28 10:06:53

0

其所需的二进制和操作&。 & &是逻辑和操作符。

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

为什么不逻辑和工作?在这种情况下,一个明智的操作会完全相反。 – Amit 2013-03-28 09:58:48

1

的代码是正确的

如果两个CALL_ACCEPTED设置和SIP_CONNECTED设置

可能是你做了检查您的代码中有一个错误之前的代码到if只执行和CALL_ACCEPTEDSIP_CONNECTED设置不正确

检查只是if两个CALL_ACCEPTED和前设置正确。

您可以调试或检查printf

+0

我的错误看到我的问题提交上面 – ant2009 2013-03-28 10:05:06

+0

问题没有改变? – MOHAMED 2013-03-28 10:12:36