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 语句。

非常感谢您的任何建议,

4

3 回答 3

1

代码是正确的

if只有同时 CALL_ACCEPTED设置和SIP_CONNECTED设置时,才会执行进入的代码

可能在您完成检查之前您的代码中有错误并且 CALL_ACCEPTEDorSIP_CONNECTED设置不正确

if在两者 之前检查CALL_ACCEPTEDSIP_CONNECTED正确设置。

您可以使用调试或使用printf

于 2013-03-28T09:43:24.283 回答
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)) 总是正确的。这是我的分析

于 2013-03-28T09:52:38.173 回答
0

它是必需的二进制 AND运算符 &。&& 是逻辑与运算符。

if((channel->base.message & SIP_CONNECTED) & (channel->base.message & CALL_ACCEPTED)) {
于 2013-03-28T09:43:11.890 回答