按位检查标志是否存在

ult*_*tus 17 language-agnostic flags bit-manipulation

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

if ((host&flagtocheckfor)==flagtocheckfor)
Run Code Online (Sandbox Code Playgroud)

哪个工作正常 - 但是这种常见的设置标志的方法是通常检查标志的方式吗?还是有更简洁的方法?

pax*_*blo 35

这与在大多数支持它们的语言中检查位标志的方式完全相同.

例如:

#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) ...
Run Code Online (Sandbox Code Playgroud)

虽然您可以检查第一个类似于:

if ((flag & BIT_7) != 0) ...
Run Code Online (Sandbox Code Playgroud)

这实际上不适用于第二个,因为如果设置了任何一个位,它将返回true ,而不是两个.

为了完整性,C允许您使用以下位置设置位掩码:

flag = flag | BIT_7;   // or you can also use 'flag |= BIT_7'
Run Code Online (Sandbox Code Playgroud)

你可以用以下方法清除它们

flag = flag & (~BIT_7);
Run Code Online (Sandbox Code Playgroud)

并切换它们:

flag = flag ^ BIT_7;
Run Code Online (Sandbox Code Playgroud)