通过按位运算确定值是否包含另一个值

determine if value contains another value with bitwise operation

我需要使用按位运算符比较给定的整数值是否包含另一个值:

这里是示例代码:

// default flags used by some function
long flags = MB_ICONERROR | MB_YESNOCANCEL;

// here somewhere else in the code, flags value is unknown
// determine if flags contains MB_ICONWARNING
if (flags & MB_ICONWARNING)
    abort(); // flags do not have MB_ICONWARNING, should be false

以上代码会命中 abort()

MB_ICONERROR 定义为 0x00000010L

MB_ICONWARNING 定义为 0x00000030L

MB_YESNOCANCEL定义为0x00000003L

我知道 & 运算符用于此目的,但它不起作用。 如果 flags 包含 MB_ICONWARNING,我想评估为真,我该怎么做?

messagebox "flag"字段不是纯位域,有些值不是纯位标志,但它们被分成特定的位。

这意味着您不能使用纯按位运算来确定是否设置了值。您需要屏蔽掉包含该值的特定位,然后与您要检查的值进行比较。

例如,图标标志似乎是第二个半字节(位 4 到 7),您可以通过使用 0xf0uu 后缀使值成为无符号整数来屏蔽) ).然后将屏蔽结果与要检查的图标值进行比较。例如

if (flags & 0xf0u == MB_ICONWARNING)
{
    // The MB_ICONWARNING "flag" is "set"
}

使用问题中的代码 flags & MB_ICONWARNING,您将获得 MB_ICONERRORMB_ICONWARNING 的 "true" 结果(以及任何等于 0x20.