C++ 位掩码帮助器:使用C+中的int和int范围列表创建位掩码+;

C++ 位掩码帮助器:使用C+中的int和int范围列表创建位掩码+;,c++,bitmask,C++,Bitmask,Edit2:伙计们,对不起,但我发现一个答案被标记为重复,而没有实际检查它是否解决了一个人的问题,这很烦人。建议的SO答案不符合所述问题。它是固定数量的变量与可变数量的变量+整数和整数值范围的变量组合。如果你仍然认为正确的方向,那么请为我所陈述的问题提供一个有效的解决方案,或者如果你不能这样做,就不要简单地将其标记为重复 我试图找到定义位掩码的最优雅的方法。此位掩码是一个整数,它定义对象在地图上的可见性(32个级别,因此位0..31定义32个级别中每个级别的可见性) 我想要的是: int vis

Edit2:伙计们,对不起,但我发现一个答案被标记为重复,而没有实际检查它是否解决了一个人的问题,这很烦人。建议的SO答案不符合所述问题。它是固定数量的变量与可变数量的变量+整数和整数值范围的变量组合。如果你仍然认为正确的方向,那么请为我所陈述的问题提供一个有效的解决方案,或者如果你不能这样做,就不要简单地将其标记为重复

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

我想要的是:

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

因此,上面是一个可变函数,它创建位掩码,其中。。需要重载以创建一个位掩码,然后将其与其他值进行OR运算

我想这真的很难。但这是不可能的吗

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

注意:原来的问题是关于重载“.”,这是不可能的。感谢您对此的澄清

我试图找到定义位掩码的最优雅的方法

考虑一下

我试图找到定义位掩码的最优雅的方法


可以考虑吗?

不可以,但您可以这样做:

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

int visibilityMask = bitrange(0,12)  |  1<<16  |  1<<22;
#定义位范围(从、到)(无符号(-1)>>from(sizeof(int)-to))

int visibilityMask=bitrange(0,12)| 1No,但您可以这样做:

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

int visibilityMask = bitrange(0,12)  |  1<<16  |  1<<22;
#定义位范围(从、到)(无符号(-1)>>from(sizeof(int)-to))


int visibilityMask=位范围(0,12)| 1个
不是运算符。asnwer基本上与for相同-事实上,问题也基本相同。类范围{public:range(inta,intb);}
?@SaniHuttunen另一方面,
..
是,但您仍然无法执行请求的操作,因为两个操作数都是原语。此外,
在这种情况下将被解析为浮点的一部分,而不是运算符。@dascandy:不,
..
都不是运算符。C++操作符的集合是有限的,并且详尽地列出了标准。所以这个问题应该用“是否可以添加
操作符..
?”来表达。重载意味着存在现有版本。否
不是运算符。asnwer基本上与for相同-事实上,问题也基本相同。类范围{public:range(inta,intb);}
?@SaniHuttunen另一方面,
..
是,但您仍然无法执行请求的操作,因为两个操作数都是原语。此外,
在这种情况下将被解析为浮点的一部分,而不是运算符。@dascandy:不,
..
都不是运算符。C++操作符的集合是有限的,并且详尽地列出了标准。所以这个问题应该用“是否可以添加
操作符..
?”来表达。重载意味着有一个现有版本。如果你想在C++中这样做,我必须建议使用一个CONTXPR函数。功能上是一样的,但至少它不是一个超越所有层次结构的丑陋定义。此外,位移位负数是UB,可能不是你想要依赖的东西;特别是对于这样一个简单的任务, CONTXPRPR <代码>是C++ 11,OP是关于C++的,而不是C++ 11。对于否定,你是正确的。我已经添加了代码>未签名的< /代码>。我认为我们应该假设C++ 11,除非有不同的说明。所有C++编译器默认默认为C++ 11代码。要启用C++11,您需要添加特殊的开关。所以,如果问题是关于C++11的,您需要添加
C++11
标记,并同意qdii。ISO已经退出C++ 03.如果你想在C++中这样做,我必须建议使用一个CONTXPR函数。功能上是一样的,但至少它不是一个超越所有层次结构的丑陋定义。此外,位移位负数是UB,可能不是你想要依赖的东西;特别是对于这样一个简单的任务, CONTXPRPR <代码>是C++ 11,OP是关于C++的,而不是C++ 11。对于否定,你是正确的。我已经添加了代码>未签名的< /代码>。我认为我们应该假设C++ 11,除非有不同的说明。所有C++编译器默认默认为C++ 11代码。要启用C++11,您需要添加特殊的开关。所以,如果问题是关于C++11的,您需要添加
C++11
标记,并同意qdii。ISO已经撤销了C++03。