c++ - C++使用位OR运算符枚举

标签 c++ enums bitwise-operators bit

我在网上找不到任何有关如何使用此方法的资源,该方法在图书馆中使用非常广泛。
我指的是这样的东西:

someFun(Class::prop1 | Class::prop2 | Class::prop3, somethingelse);
现在,我无法理解这是基于2的幂的枚举/整数,所以类似:
class Class{
public
     enum{prop1 = 1, prop2 = 2, prop3 = 4, prop4 = 8};
};
然后使用this之类的东西来检查第n位是0还是1,但是有没有办法以一种更简洁的方式来做到这一点?
如果您愿意,可以使用以下示例:
class Class{
public:
     enum{prop1 = 1, prop2 = 2, prop3 = 4};
     void f(int i){
         if( ... ) ...
     }
};
我在想也许使用&运算符,例如if(i & Class::prop1) ...,但是使用idk是正确的方法

最佳答案

您的示例是正确的,并且遵循使用枚举的经典C样式位集。或者,您可以使用左移来声明枚举成员,这可能会提高不熟悉的人的可读性:

enum Flags {
  flag0 = 1<<0,
  flag1 = 1<<1,
  flag2 = 1<<2
};
flags & flag0在if条件中起作用的原因是,如果整数为0,则该条件仅对整数进行求值为false。在按位AND运算中,其中一个操作数为2的幂,这意味着另一个操作数中未设置特定位。
一种替代方法是使用隐式值声明您的枚举:
enum class MyFlags {
  flag0, flag1, flag2 // implicit values are consecutive, starting with 0
};
然后直接或通过新类型使用std::bitset:
class MyBitset {
public:
   explicit MyBitset(std::initializer_list<MyFlags> flags) {
     for (MyFlags f : flags)
       values.set(static_cast<unsigned>(f));
   }
   
   bool test(MyFlags f) { return values.test(static_cast<unsigned>(f); }
private:
   std::bitset<WIDTH> values; // see below
};
优点是,现在您可以使用初始化器列表构造一组标志,类似于STL:
MyBitset({MyFlags::flag0, MyFlags::flag2})
这种选择的问题是最大值。理想情况下,我们将设置位宽,使其具有足够的容量以容纳最大的标志值。我们可以使用类型特征来指定它,然后MyBitset可以是通用的:
template <class T> struct MyLimits;

template <> struct MyLimits<MyFlags> {
   static constexpr bool isEnum = true;
   static constexpr size_t min = static_cast<size_t>(Flags::flag0);
   static constexpr size_t max = static_cast<size_t>(Flags::flag2);
};

// fails if MyLimits was not specialized for MyFlags
std::bitset<MyLimits<MyFlags>::max> values; 

关于c++ - C++使用位OR运算符枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338177/

相关文章:

c++ - Segmentation Fault 删除节点

c++ - 如何创建目录 C++(使用 _mkdir)

我可以在 C 中使用 int 类型作为 IP 地址的网络掩码吗?

c++ - C/C++ : Bitwise operators on dynamically allocated memory

c++ - Visual C++ 和 *nix 环境下的编译差异

c - C 中的枚举迭代

java - 枚举类型可能无法实例化错误

c++ - 从成员函数返回枚举

c++ - 性能方面,按位运算符与普通模数相比有多快?

c++ - 以非阻塞方式打开 QDialog