在C++中,我像这样将一个bitset初始化为-3:
std::bitset<32> mybit(-3);
有没有一种优雅的方式将mybit
转换为-3
。因为bitset对象只有像to_ulong
和to_string
这样的方法。
使用to_ulong
将其转换为unsigned long
,然后进行普通转换以将其转换为int
。
int mybit_int;
mybit_int = (int)(mybit.to_ulong());
static_cast
,代码对于有人更改类型更具弹性。https://dev59.com/n3VD5IYBdhLWcg3wDXJ3#103868 我曾经看到过各种场合,C风格的转换是可以的,直到有人更改了某些内容,然后它们就不行了。使用 static_cast
将通过编译器错误检测到这一点。 - Steve#include <bitset>
#include <iostream>
template<std::size_t SIZE>
int bitSetToInt(std::bitset<SIZE> bitSet) {
if (!bitSet[SIZE - 1]) return bitSet.to_ulong();
bitSet.flip();
return -(bitSet.to_ulong() + 1);
}
int main() {
std::bitset<31> bitSet1(7);
std::bitset<31> bitSet2(-7);
std::bitset<32> bitSet3(7);
std::bitset<32> bitSet4(-7);
std::cout << bitSet1 << " = " << bitSetToInt(bitSet1) << std::endl;
std::cout << bitSet2 << " = " << bitSetToInt(bitSet2) << std::endl;
std::cout << bitSet3 << " = " << bitSetToInt(bitSet3) << std::endl;
std::cout << bitSet4 << " = " << bitSetToInt(bitSet4) << std::endl;
}
0000000000000000000000000000111 = 7
1111111111111111111111111111001 = -7
00000000000000000000000000000111 = 7
11111111111111111111111111111001 = -7
#include <iostream>
#include <boost/dynamic_bitset.hpp>
int dynamicBitSetToInt(boost::dynamic_bitset<> bitSet) {
if (!bitSet[bitSet.size() - 1]) return (int) bitSet.to_ulong();
bitSet.flip();
return (int) -(bitSet.to_ulong() + 1);
}
int main() {
boost::dynamic_bitset bitSet1(31, 7);
boost::dynamic_bitset bitSet2(31, -7);
boost::dynamic_bitset bitSet3(32, 7);
boost::dynamic_bitset bitSet4(32, -7);
std::cout << bitSet1 << " = " << dynamicBitSetToInt(bitSet1) << std::endl;
std::cout << bitSet2 << " = " << dynamicBitSetToInt(bitSet2) << std::endl;
std::cout << bitSet3 << " = " << dynamicBitSetToInt(bitSet3) << std::endl;
std::cout << bitSet4 << " = " << dynamicBitSetToInt(bitSet4) << std::endl;
}
std::bitset
有将值转换为ulong的函数。因此,就像@Barmar所说的那样,将该long强制转换为int。那么你的问题是什么?在发布问题之前,您是否阅读了文档或尝试过任何操作? - Manu343726ulong
转换为long
,然后转换为int
,即int(long(mybit.to_ulong()))
。 - Erkin Alp Güney