在C++中将位集转换为整数

33

在C++中,我像这样将一个bitset初始化为-3:

std::bitset<32> mybit(-3);

有没有一种优雅的方式将mybit转换为-3。因为bitset对象只有像to_ulongto_string这样的方法。


3
将其转换为无符号长整型,然后将其强制转换为整型。 - Barmar
正如文档所述,std::bitset有将值转换为ulong的函数。因此,就像@Barmar所说的那样,将该long强制转换为int。那么你的问题是什么?在发布问题之前,您是否阅读了文档或尝试过任何操作? - Manu343726
1
@Johnsyweb 他可能想要处理负值,因为他的示例显示了这一点。 - Kaidjin
ulong转换为long,然后转换为int,即int(long(mybit.to_ulong())) - Erkin Alp Güney
2个回答

64

使用to_ulong将其转换为unsigned long,然后进行普通转换以将其转换为int

int mybit_int;

mybit_int = (int)(mybit.to_ulong());

演示


31
由于这是C ++,我建议使用static_cast<int>(mybit.to_ulong()),而不是C样式转换。 - Steve
2
无法运行,仍然输出无符号整数。-3变成了251。 - FluorescentGreen5
@Barmar 哦,我使用了<8>而不是<32>截断签名。 - FluorescentGreen5
1
@ErkinAlpGüney 我认为他的建议是关于风格的 - 在C++中,你应该使用模板语法而不是C语法进行转换,因为它可以更清晰地表达你的意图。但我并不是那么纯粹主义者,我觉得冗长的语法让人望而却步。 - Barmar
2
@ErkinAlpGüney - 我的建议是关于操作的安全性。如果您使用 static_cast,代码对于有人更改类型更具弹性。https://dev59.com/n3VD5IYBdhLWcg3wDXJ3#103868 我曾经看到过各种场合,C风格的转换是可以的,直到有人更改了某些内容,然后它们就不行了。使用 static_cast 将通过编译器错误检测到这一点。 - Steve
显示剩余2条评论

1
一个完整的例子适用于32位和非32位的位集合。
#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接