我需要使用按位运算符比较给定的整数值是否包含另一个值:
这里是示例代码:
// 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
,我想评估为真,该怎么办?
消息框“标志”字段不是纯位字段,某些值不是纯位标志,但是将它们分成特定的位。
这意味着您不能使用纯按位运算来确定是否设置了值。您需要屏蔽掉包含该值的特定位,并与要检查的值进行比较。
例如,图标标志似乎是第二个半字节(第4至7位),您可以通过使用0xf0u
(将后缀u
设置为无符号整数)进行屏蔽来获得。然后,将屏蔽的结果与要检查的图标值进行比较。例如
if (flags & 0xf0u == MB_ICONWARNING)
{
// The MB_ICONWARNING "flag" is "set"
}
使用问题中的代码flags & MB_ICONWARNING
,您将同时获得MB_ICONERROR
和MB_ICONWARNING
(以及等于0x20
的任何值)的“ true”结果。