我需要使用超过32位的位标志(现在确切地说是33位)。我试过,发现std :: bitset不能处理超过32位(ulong)。我是否必须使用矢量或有一种方法使bitset工作?
我在这个项目中仅限于c ++ 98,所以我不能使用boost。
感谢。
编辑:
我想做这样的事情:
const uint64 kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
switch(myBitSet) {
case kBigNumber:
// do something
...
}
答案 0 :(得分:6)
std::bitset
应该使用或多或少的任意大小 - 它的不通常仅限于unsigned long的大小(虽然它看起来像那样,因为有一个构造函数可以构建基于无符号长整数位的bitset。
如果这不起作用,vector<bool>
可能对您有用,但您应该知道它只是名义上的vector
- 它不是真正的容器(即,不符合正常的容器要求)。
答案 1 :(得分:5)
std::vector<bool>
能为你效力吗?它可以调整大小,速度相当快,占地面积小。它也是STL的一部分。
答案 2 :(得分:4)
我刚刚用65位重新测试std::bitset
,在我的32位Linux上,它正常工作并且符合预期。
值得注意的例外是to_ulong()
方法,如果在转换过程中任何设置位被截断,则抛出异常。现在我考虑一下,这是显而易见的:没有其他方法可以阻止应用程序获取截断的数据。行为is also documented。
带开关/案例的编辑。你为什么需要std::bitset
呢?您的平台显然已经支持64位数字 - 使用它们。 std::bitset
旨在用作an light-weight bit array静态内存分配。它不能用作数字的替代品。
答案 3 :(得分:1)
您可以使用bitset上的to_string并使用strtoull
将其转换回来const uint64 kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
unsigned long long bitSetLong = strtoull(myBitSet.to_string<char,char_traits<char>,allocator<char> >().c_str(), NULL, 2);
switch(bitSetLong) {
case kBigNumber:
// do something
...
}
请注意,上述内容只能工作到64位。