Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 超过32位的位集?_C++_Stl_Bitset - Fatal编程技术网

C++ 超过32位的位集?

C++ 超过32位的位集?,c++,stl,bitset,C++,Stl,Bitset,我现在需要使用32位以上33位的位标志。我尝试并发现std::bitset处理的ulong不超过32位。我必须使用向量还是有办法使位集工作 我在这个项目中仅限于c++98,所以我不能使用boost 谢谢 编辑: 我想这样做: const uint64 kBigNumber = 1LL << 33; std::bitset<33> myBitSet; ... switch(myBitSet) { case kBigNumber: // do somet

我现在需要使用32位以上33位的位标志。我尝试并发现std::bitset处理的ulong不超过32位。我必须使用向量还是有办法使位集工作

我在这个项目中仅限于c++98,所以我不能使用boost

谢谢

编辑:

我想这样做:

const uint64    kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
switch(myBitSet) {
    case kBigNumber:
    // do something
    ...
}
std::vector对你有用吗?它可以调整大小,速度相当快,占地面积小。它也是STL的一部分。

std::位集应该可以处理或多或少的任意大小-它通常不限于无符号长的大小,尽管它看起来可能是这样的,因为有一个构造函数可以基于无符号长的位构建位集

如果这不起作用,vector可能会对您有用,不过您应该知道,它实际上只是一个名义上的向量-它不是一个真正的容器,即不符合正常的容器要求。

我刚刚重新测试了65位的std::bitset,在我的32位Linux上,它运行良好,符合预期

值得注意的异常是to_ulong方法,如果在转换过程中任何设置位被截断,该方法将引发异常。现在我考虑了一下,这一点非常明显:并没有其他方法可以防止应用程序获取被截断的数据。和行为


使用开关/案例进行编辑。那么为什么需要std::bitset呢?您的平台显然已经支持64位数字-使用它们。位集设计为与静态内存分配一起使用。它不用于替换数字。

您可以在位集中使用to_字符串,并使用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位之前有效。

您可能需要对单个32位值执行多个位集操作?实际上,我希望能够在位集和64位常量之间执行位操作。类似于ifmy33bitset&kA64bitConst{…}。另外,在switch语句的case子句中使用64位常量的能力也很好。你怎么可能只限于C++98?@DeadMG:这是一个遗留项目,我对构建过程做不了太多。我现在使用的是纯64位unsigned。我正在探索不同的方法来实现这一点,同时也在为标志可以超过64位的未来做计划。在C/C++中,只能对switch/case使用整数类型。uint64_t或编译器支持的任何最宽的整数类型都是32位arch所能支持的。还有超过64面旗帜——这听起来是个坏主意。请在此询问如何避免这种情况。但令人兴奋的是,它不符合STL