【问题标题】:C++/WinAPI - Removing a flag from a DWORD (bitwise operator?)C++/WinAPI - 从 DWORD 中删除标志(按位运算符?)
【发布时间】:2012-10-08 05:57:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ winapi bit-manipulation flags dword


    【解决方案1】:

    AND 与不属于该标志的位:

    dwMyFlags &= ~dwSomeFlag;
    

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

    dwMyFlags &= ~(dwSomeFlag | dwSomeOtherFlag);
    

    此外,匈牙利符号已经过时了。

    【讨论】:

    • +1 例如删除多个标志。另外,我知道,我从不使用它,我只是为了示例而想这样做。我通常给我的变量提供简短但描述性的名称。匈牙利符号让我觉得代码很难看。
    • @BrandonMiller,当你想知道它是什么类型时,它会更有用。
    • 是的,使用 Visual Assist X,我只需将鼠标悬停在变量上即可查看其类型。
    【解决方案2】:

    用你想要的标志的 inverse 按位执行&

    dwMyFlags = dwMyFlags & ~dwSomeFlag;
    

    您可以使用&= 缩写:

    dwMyFlags &= ~dwSomeFlag;
    

    【讨论】:

    • +1 表示逆,区分缩写和完整形式。
    【解决方案3】:

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

    dwMyFlags ^= dwSomeFlag;
    

    如果不确定flag的状态,需要按位&,按位不用~

    dwMyFlags &= ~dwSomeFlag;
    

    【讨论】:

    • +1 太好了,第二种方法使我免于编写另一个 if 语句。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2010-10-06
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多