C++/WinAPI - 从DWORD中删除标志(按位运算符?)

Bra*_*ler 1 c++ winapi flags dword bit-manipulation

我现在知道如何使用按位&AND运算符检查DWORD(特别是Windows样式)中是否存在某个标志.我该怎么做:

if (dwMyFlags & dwSomeFlag) {
    // dwMyFlags contains dwSomeFlag
    // ->> How do I remove dwSomeFlag from dwMyFlags?
}
Run Code Online (Sandbox Code Playgroud)

我知道减去它是行不通的,是否有一些运算符可以从DWORD中删除标志?

Ian*_*Ian 9

如果您知道该标志已设置,您可以使用独占或取消设置:

dwMyFlags ^= dwSomeFlag;
Run Code Online (Sandbox Code Playgroud)

如果你不确定标志的状态,你需要使用按位&,而不是按位〜

dwMyFlags &= ~dwSomeFlag;
Run Code Online (Sandbox Code Playgroud)


pb2*_*b2q 7

&用你想要的标志的倒数做一点点:

dwMyFlags = dwMyFlags & ~dwSomeFlag;
Run Code Online (Sandbox Code Playgroud)

您可以使用&=以下缩写:

dwMyFlags &= ~dwSomeFlag;
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 5

AND与不属于该标志的位:

dwMyFlags &= ~dwSomeFlag;
Run Code Online (Sandbox Code Playgroud)

这可以扩展为删除多个标志:

dwMyFlags &= ~(dwSomeFlag | dwSomeOtherFlag);
Run Code Online (Sandbox Code Playgroud)

此外,匈牙利的表示法已经过时了.