位运算检查标志是否存在

28

有没有一种通常用于检查 int/其他数据类型中是否存在标志的方法? 我想出了这样的代码:

if ((host&flagtocheckfor)==flagtocheckfor)

这样做很好- 但是设置标志的这种方法很常见,这是检查标志的通常方式吗?还是有更简洁的方法?


4
不需要“flagtocheckfor”这一部分。在逻辑与运算的结果中,要么为0(表示位关闭),要么非零(表示位开启)。至少在C语言中,这已经对应于False和True了。请注意不改变原本的意思并简化语言。 - librik
6
@librik,如果是单个比特掩码的话还好,但有些可能是多比特。请看我的回答。 - paxdiablo
1个回答

51

这就是大多数支持位标志的语言中检查位标志的方法。

例如:

#define BIT_7 0x80
#define BITS_0_AND_1 0x03

if ((flag & BIT_7) == BIT_7) ...
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ...

虽然你可以使用以下方式检查第一个元素:

if ((flag & BIT_7) != 0) ...

对于第二种情况,那不会真正起作用,因为它将在两个位中任意一个被设置为1时返回true,而不是在这两个位都被设置为1时返回true。

为了完整起见,C允许您使用以下方式设置位掩码:

flag = flag | BIT_7;   // or you can also use 'flag |= BIT_7'

您可以使用以下方法清除它们:

flag = flag & (~BIT_7);

并使用以下方法切换它们:

flag = flag ^ BIT_7;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接