代码之家  ›  专栏  ›  技术社区  ›  Stephen Chu

超过32位的位集?

  •  4
  • Stephen Chu  · 技术社区  · 14 年前

    我需要使用32位以上的位标志(现在准确地说是33位)。我试着发现std::bitset不能处理超过32位(ulong)。我必须使用向量还是有办法使位集工作?

    在这个项目中,我只能使用c++98,所以我不能使用boost。

    编辑:

    我想这样做:

    const uint64    kBigNumber = 1LL << 33;
    std::bitset<33> myBitSet;
    ...
    switch(myBitSet) {
        case kBigNumber:
        // do something
        ...
    }
    
    4 回复  |  直到 14 年前
        1
  •  4
  •   Dummy00001    14 年前

    我刚复试过 std::bitset

    值得注意的例外是 to_ulong() 方法,如果在转换过程中任何设置位被截断,则引发异常。现在我想了想,这是很明显的:没有其他方法可以阻止应用程序获取截断的数据。以及行为 is also documented .


    编辑 带开关/外壳。你为什么需要 标准::位集 标准::位集 设计用于 an light-weight bit array 静态内存分配。它不是用来代替数字的。

        2
  •  6
  •   Jerry Coffin    14 年前

    std::bitset 应该或多或少地适应任意的尺寸 通常限制为无符号long的大小(尽管看起来是这样,因为有一个构造函数基于无符号long中的位构建位集)。

    vector<bool> 可能对你有用,不过你应该意识到 vector 确实是一个容器(即,不符合正常的容器要求)。

        3
  •  5
  •   andand    14 年前

    会吗 std::vector<bool> 为你工作?它可以调整大小,速度相当快,占地面积小。它也是STL的一部分。

        4
  •  1
  •   aeh    14 年前

    您可以使用位集上的to\u字符串并使用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
        ...
    }