通过按位运算确定值是否包含另一个值
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),您可以通过使用 0xf0u
(u
后缀使值成为无符号整数来屏蔽) ).然后将屏蔽结果与要检查的图标值进行比较。例如
if (flags & 0xf0u == MB_ICONWARNING)
{
// The MB_ICONWARNING "flag" is "set"
}
使用问题中的代码 flags & MB_ICONWARNING
,您将获得 MB_ICONERROR
和 MB_ICONWARNING
的 "true" 结果(以及任何等于 0x20
.
我需要使用按位运算符比较给定的整数值是否包含另一个值:
这里是示例代码:
// 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),您可以通过使用 0xf0u
(u
后缀使值成为无符号整数来屏蔽) ).然后将屏蔽结果与要检查的图标值进行比较。例如
if (flags & 0xf0u == MB_ICONWARNING)
{
// The MB_ICONWARNING "flag" is "set"
}
使用问题中的代码 flags & MB_ICONWARNING
,您将获得 MB_ICONERROR
和 MB_ICONWARNING
的 "true" 结果(以及任何等于 0x20
.