4

我需要使用超过 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
    ...
}
4

4 回答 4

6

std::bitset应该使用或多或少的任意大小 - 它通常不限于 unsigned long 的大小(尽管它看起来可以这样,因为有一个构造函数基于 unsigned long 中的位构建位集)。

如果这不起作用,vector<bool>可能对您有用,尽管您应该知道它几乎vector只是名义上的——它不是真正的容器(即,不符合正常的容器要求)。

于 2010-08-31T15:24:46.547 回答
5

std::vector<bool>为你工作吗?它可以调整大小,速度相当快并且占用空间小。它也是 STL 的一部分。

于 2010-08-31T15:19:22.447 回答
4

我刚刚std::bitset用 65 位重新测试过,在我的 32 位 Linux 上它工作正常并且符合预期。

值得注意的异常是to_ulong()在转换过程中任何设置位被截断时抛出异常的方法。现在我想了想,这很明显:没有其他方法可以防止应用程序获取截断的数据。并且该行为也被记录在案


使用 switch/case进行编辑。那你为什么需要std::bitset?您的平台显然已经支持 64 位数字 - 使用它们。std::bitset旨在用作具有静态内存分配的轻量级位数组。它不打算用作数字的替代品。

于 2010-08-31T15:49:02.147 回答
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 位。

于 2010-08-31T16:30:21.003 回答