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语句中。
非常感谢任何建议,
答案 0 :(得分:1)
代码正确
if
中的代码仅在CALL_ACCEPTED
设置且SIP_CONNECTED
设置
可能在您完成检查之前,您的代码中存在错误且CALL_ACCEPTED
或SIP_CONNECTED
未正确设置
在if
之前检查是否正确设置了CALL_ACCEPTED
和SIP_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)) {