определить, содержит ли значение другое значение с помощью побитовой операции - PullRequest
0 голосов
/ 19 октября 2019

Мне нужно сравнить, если данное целое значение содержит другое значение, используя битовые операторы:

вот пример кода:

// 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

Я знаю, что для этого используется оператор &Но это не работает. Я хочу оценить значение true, если flags содержит MB_ICONWARNING, как мне это сделать?

1 Ответ

3 голосов
/ 19 октября 2019

Поле «флаг» в окне сообщения не является чистым битовым полем, некоторые значения не являются чистыми битовыми флагами, но они разделены на определенные биты.

Это означает, что вы не можете использовать чисто побитовые операции для поискавне, если значение установлено или нет. Вам необходимо замаскировать конкретные биты, которые содержат значение, и сравнить со значением, которое вы хотите проверить.

Например, значки флагов кажутся вторым полубайтом (биты с 4 по 7), которыйвы получаете маскировку с 0xf0u (суффикс u, чтобы сделать значение целым числом без знака). Затем вы сравниваете результат маскирования со значением значка, которое хотите проверить. Например,

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

С кодом, который у вас есть в вопросе, flags & MB_ICONWARNING, вы получите «истинный» результат как для MB_ICONERROR, так и для MB_ICONWARNING (и любое значение, равное0x20.

...