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

问题描述 投票:0回答:1

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

这里是示例代码:

// 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,我想评估为真,该怎么办?

c++ bitwise-operators
1个回答
2
投票

消息框“标志”字段不是纯位字段,某些值不是纯位标志,但是将它们分成特定的位。

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

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

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

使用问题中的代码flags & MB_ICONWARNING,您将同时获得MB_ICONERRORMB_ICONWARNING(以及等于0x20的任何值)的“ true”结果。

© www.soinside.com 2019 - 2024. All rights reserved.