C++ 自动生成位位置
我有一些像这样的位掩码:C++ 自动生成位位置,c++,C++,我有一些像这样的位掩码: namespace bits { const unsigned bit_one = 1u << 0; const unsigned bit_two = 1u << 1; const unsigned bit_three = 1u << 2; ...... const unsigned bit_ten = 1u << 10; } namespace bits { co
namespace bits {
const unsigned bit_one = 1u << 0;
const unsigned bit_two = 1u << 1;
const unsigned bit_three = 1u << 2;
......
const unsigned bit_ten = 1u << 10;
}
namespace bits {
const unsigned bit_one = 1u << COUNTER;
const unsigned bit_two = 1u << COUNTER;
const unsigned bit_three = 1u << COUNTER;
......
const unsigned bit_ten = 1u << COUNTER;
}
名称空间位{
常量无符号位_one=1u为什么不使用带参数的宏
#define BIT(n) (1 << (n))
#定义位(n)(1经典解决方案是枚举字段:
enum foo_flags {
alpha,
beta,
gamma,
count
};
然后使用std::bitset
或H2CO3建议的位宏:
BIT(alpha)
微软C++具有
__COUNTER__
预定义的宏,因此您可以
#define NEXTBIT (1u << __COUNTER__)
namespace bits {
const unsigned bit_one = NEXTBIT;
const unsigned bit_two = NEXTBIT;
const unsigned bit_three = NEXTBIT;
}
<代码> >定义NExtBIT(1U),可以使用< C++ >代码>宏>,这是标准C和C++的一部分。请谨慎使用,并记录您的意图,以便其他人阅读代码。
#include <iostream>
namespace Bits
{
const unsigned Base = __LINE__ + 1;
const unsigned BitOne = 1u << __LINE__-Base;
const unsigned BitTwo = 1u << __LINE__-Base;
const unsigned BitThree = 1u << __LINE__-Base;
}
int main(void)
{
std::cout << Bits::BitOne << '\n';
std::cout << Bits::BitTwo << '\n';
std::cout << Bits::BitThree << '\n';
return 0;
}
#包括
名称空间位
{
常量无符号基=_行_;+1;
const unsigned BitOne=1u以下选项可以实现此目的:
#define NEXT_MASK(x) \
DUMMY1_##x, \
x = (1U << DUMMY1_##x), \
DUMMY2_##x = DUMMY1_##x
enum {
NEXT_MASK(one),
NEXT_MASK(two),
NEXT_MASK(three),
NEXT_MASK(four)
};
#include <stdio.h>
int main()
{
printf("%x\n", one);
printf("%x\n", two);
printf("%x\n", three);
printf("%x\n", four);
return 0;
}
想法是第一个虚拟枚举比前一个增加一步。x是掩码,第二个虚拟还原值,这样下一个宏就有了一个好的起点。您没有真正展示任何合理的用例。这个示例是无用的。@BartekBanachewicz,例程循环大量数据并分配各种标志“定义位(n)1u@LastCoder我想要后者。基本上,我在寻找一组唯一的常量位掩码,排序并不重要(只要编译后它是常量)。或位(x,n)(x抱歉,问题不完全清楚。我希望每次使用BIT
时,不必手动键入n
。枚举的位号将自动递增1(例如,编号为0..32的位)用宏把枚举的比特数转换成你想要的掩码。WoooO!给你的程序添加一行注释实际上会破坏它!这看起来很难对付,似乎违背了我所有的C++本能,但是评论并不会像@ Lyyddor建议的那样破坏程序,只要使用了所有的东西。奇怪的是,到目前为止,这是最接近解决方案的。
1
2
4
8