Конвертировать набор битов в int в C++
В с ++. Я инициализирую набор битов в -3 как:
std::bitset<32> mybit(-3);
Есть ли способ благодати, который преобразует mybit
в -3
, Поскольку у объекта набора битов есть только методы как to_ulong
а также to_string
,
2 ответа
Решение
Использование to_ulong
преобразовать его в unsigned long
затем обычное приведение, чтобы преобразовать его в int
,
int mybit_int;
mybit_int = (int)(mybit.to_ulong());
Один полный пример работал как для 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;
}