C ++ / WinAPI — удаление флага из DWORD (побитовый оператор?)

Теперь я знаю, как проверить наличие определенного флага в DWORD (в частности, в стиле Windows) с помощью побитового & И оператор. Как бы я это сделал:

if (dwMyFlags & dwSomeFlag) {
// dwMyFlags contains dwSomeFlag
// ->> How do I remove dwSomeFlag from dwMyFlags?
}

Я знаю, что вычитание не будет работать, есть ли оператор, который может удалить флаги из DWORD?

1

Решение

Если вы знаете, что флаг установлен, вы можете использовать исключение или сброс:

dwMyFlags ^= dwSomeFlag;

Если вы не уверены в состоянии флага, вам нужно использовать побитовое &и поразрядно не ~

dwMyFlags &= ~dwSomeFlag;
9

Другие решения

Сделать побитовый & с обратный флага, который вы хотите:

dwMyFlags = dwMyFlags & ~dwSomeFlag;

Вы можете сократить это используя &=:

dwMyFlags &= ~dwSomeFlag;
7

И с битами, которые не являются частью этого флага:

dwMyFlags &= ~dwSomeFlag;

Это также масштабируется для удаления нескольких флагов:

dwMyFlags &= ~(dwSomeFlag | dwSomeOtherFlag);

Кроме того, венгерская нотация пережила его использование.

5
По вопросам рекламы [email protected]