比较按位运算符

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

非常感谢您的建议,

最佳答案

您检查过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)) 总是正确的。这就是我的分析

关于比较按位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678405/

相关文章:

c - "static"在C中是什么意思?

c - C中类型转换和按位运算的结果取决于顺序

包含按位运算符的代码无法通过测试用例

C - 按值传递和按引用传递不一致

objective-c - 将 "hello world"扩展为 HelloWorld 的 C 预处理器宏

bit-manipulation - 使用 1 的补码生成显示第一个非零位的掩码

java - 如何在java opencv中执行并集运算

c - 这段代码是怎么回事?

c++ - 修复此编译错误 : identifier "and" is a special operator name in C++ [-Werror=c++-compat]?

c - 从目录中逐一读取文件