比较按位运算符

时间:2013-03-28 09:38:01

标签: c bitwise-operators

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

非常感谢任何建议,

3 个答案:

答案 0 :(得分:1)

代码正确

if中的代码仅在CALL_ACCEPTED设置且SIP_CONNECTED设置

时执行

可能在您完成检查之前,您的代码中存在错误且CALL_ACCEPTEDSIP_CONNECTED未正确设置

if之前检查是否正确设置了CALL_ACCEPTEDSIP_CONNECTED

您可以使用调试或printf

进行检查

答案 1 :(得分: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)) 总是如此。那是我的分析

答案 2 :(得分:0)

需要二进制AND 运算符&amp; 。 &安培;&安培;是逻辑和运营商。

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