位掩码助手:使用C ++中的int和int-range列表创建位掩码

时间:2013-05-03 12:10:08

标签: c++ bitmask

Edit2:大家好,很抱歉,但我发现将答案标记为重复而没有实际检查它是否解决了一个问题令人讨厌。建议的SO答案不符合规定的问题。它是固定数量的变量与变量变量数量+整数范围和整数值的可变组合。如果你仍然认为正确的方向,那么请提供一个有效的解决方案来解决我说明的问题,或者如果你不能这样做,就不要把它标记为重复。

我试图找到最优雅的方法来定义位掩码。此位掩码是一个整数,它定义了地图上对象的可见性(32个级别,因此位0..31定义了32个级别中每个级别的可见性)。

我想要的是:

int visibilityMask = CreateVisibilityMask(0..12,16,22);

所以上面会是一个可变函数来创建位掩码,其中..需要重载才能自己创建一个位掩码,然后与其他值进行“或”运算。

我猜这个真的很难。但这不可能吗?

编辑:对不起,伙计们,但如果您认为这个答案与您建议的答案重复,那么请根据我的需要创建一个如何使用其他答案的示例。 提供的答案不允许变量中的范围和单个int值的任意组合 - 如果您认为它很容易解决,请提供。

注意:最初的问题是关于超载" ..",这是不可能的。感谢您澄清此事。

2 个答案:

答案 0 :(得分:1)

不,但你可以这样做:

#define bitrange(from,to)  (unsigned(-1) >> from << from << (sizeof(int)-to) >> (sizeof(int)-to)) 

int visibilityMask = bitrange(0,12)  |  1<<16  |  1<<22;

回答评论(评论太长了)。

我现在只用C + 11写作。大多数情况下都很复杂 元编程库。

在这种情况下,我会自己使用constexpr函数。 尽管事实上我已经向GCC和CLANG(gcc-54648,clang-13970)提交了几个consexpr错误。

这是快速而又脏的代码,显示了如何执行此操作。而且我写了 “像这样的东西”。用constexpr为我重写这个是微不足道的,但我不会。我为OP写了这个,它可能没有C ++ 11编译器,可能不知道constexpr是什么。 OP没有询问风格指南,他需要解决方案。如果你们有更好的解决方案,请发表你的答案。

答案 1 :(得分:0)

  

我正在尝试找到最优雅的方法来定义位掩码。

改为考虑std::bitset