c++ - 按位,位掩码 : whats wrong here?

标签 c++ bitmask

我想通过对它们进行位掩码来跟踪一些选项,并从 this answer 中借用了位掩码值, 但它们似乎无法协同工作。

#include <iostream>

#define OP1 0x00003FFFUL
#define OP2 0x00007FFFUL
#define OP3 0x0000FFFFUL

int main() {
        unsigned long params = 0; // .
        params |= OP3;
        if ( (params & OP1) == OP1)
                std::cout << "Whoa. Lame masking\n";
}

这是一个类型问题,还是这个方法不能用于一次保存超过 1 个选项(OP1、OP2 和 OP3 都希望保持在相同的 params 中)?

最佳答案

对于选项,您应该使用其他不重叠的掩码,例如:

   #define OP1 0x000000FUL
   #define OP2 0x00000F0UL
   #define OP3 0x0000F00UL

或者(在这种情况下,您将能够存储尽可能多的选项):

   #define OP1 0x0000001UL
   #define OP2 0x0000002UL
   #define OP3 0x0000004UL
   //ETC...

你的面具永远不会正常工作,因为如果设置了 OP3,那么 OP1 和 OP2 将被包含(如果你使用 OP2 也是如此,那么将隐含 OP1):

     FFFF = 1111111111111111
  &  3FFF = 0011111111111111
     -----------------------
     3FFF = 0011111111111111

您粘贴的示例中的掩码旨在推断 UL 的最后几位。

关于c++ - 按位,位掩码 : whats wrong here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6245578/

相关文章:

c++ - 在哪里声明结构等?

c++ - STL 不从系统级别释放内存

c - 在 C 中匹配二进制模式

python - 如何正确使用 tf.scatter_update 进行 N 维更新?

algorithm - 如何在 O(2^n) 内存和 O(2^n *n) 时间中检查哈密顿行走是否存在

c++ - 这是否违反了严格的别名或指针对齐规则?

c++ - 在带有 static_assert 的命名空间中使用 constexpr 会出错

c++ - 结构作为函数的参数 : more efficient to copy or dereference?

c - 如何使用C程序根据不同的长度值设置掩码

java - 在位域变量中设置值