Rus*_*han 1 c++ enums bit-shift
假设我有一个用于标志的枚举,即
enum Flags { Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2 };
Run Code Online (Sandbox Code Playgroud)
如果给出一个Flags值,我想知道该值的位移是什么.基本上,因为Flag1我想返回0,因为Flag2我想返回1,等等.除了使用带switch语句的函数之外,任何人都可以想到这样做的方法.
我想要这个因为我有一个数据数组,函数的返回值是这个数组的元素之一.要返回的元素取决于将哪个标志传递给函数.
我想以更简洁的方式执行以下操作.特别是如果我修改枚举,我不需要返回并修改此功能.
myobj* objects[3] = { obj1, obj2, obj3 };
myobj* GetObj(Flags FlagValue)
{
switch(FlagValue)
{
case Flag1:
return objects[0];
case Flag2:
return objects[1];
case Flag3:
return objects[2];
}
}
Run Code Online (Sandbox Code Playgroud)
你需要的是一个函数,它计算你的枚举值中的尾随零.有很多方法可以做到这一点(请参阅https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightLinear),但大多数现代平台通常都提供专用的CPU指令.由于该语言没有相应的运算符,因此只能通过非标准的编译器特定方式访问该指令,例如__builtin_ctzGCC或_BitScanReverseMSVC.
但是,如果您只使用编译时值,那么更好的C++解决方案就是这样的
template <unsigned N> struct ctz {
static const unsigned value = ctz<N - 1>::value + 1;
};
template <> struct ctz<1> {
static const unsigned value = 0;
};
template <> struct ctz<0>; // Left undefined
...
cout << ctz<Flag2>::value << endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
280 次 |
| 最近记录: |