我想从字符串或标准输入中将base10数读入位集中。有没有什么std函数可以做到这一点,或者我必须自己实现它?
示例:
bitset<4> buffer;
cin >> buffer;
cout << buffer;输入:5
输出: 0101
注意:我需要支持任何长度的输入,只要它适合在位集内
发布于 2018-06-11 11:54:36
您可以简单地使用std::bitset构造函数:
bitset( unsigned long val );请注意,在没有提供足够位的情况下,结果将保留最低有效的N位。
例如。
std::bitset<2> set(5);
std::cout << set << std::endl;01 (代替101)
发布于 2018-06-12 14:52:24
您可以使用boost multiprecision库来存储任意大小的整数,然后对其进行处理以生成二进制输出。
下面是使用库的代码,使用std::hex转换为十六进制,然后读取十六进制流并输出二进制流。我重载了bitset的>>,以便将大的十进制数读入位流。<<按照预期输出正确的二进制输出。你可以使用任何大小的位集(4的倍数),它应该可以工作。粗略地说,必须进行错误检查,以便它不会跨越位集大小。也许你可以从这个版本开始。
#include <boost/multiprecision/cpp_int.hpp>
#include<bitset>
#include<iostream>
using namespace std;
template<int N>
istream& operator >> (istream& in, bitset<N>& b)
{
using namespace boost::multiprecision;
cpp_int bigNumber;
stringstream ss;
in >> bigNumber;
ss << std::hex << bigNumber;
b.reset();
int i = 0;
string s = ss.str();
for (auto& iter = s.rbegin(); iter != s.rend(); iter++)
{
switch (toupper(*iter))
{
case '0':
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 0; i++;
break;
case '1':
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 0; i++;
break;
case '2':
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 0; i++;
break;
case '3':
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 0; i++;
break;
case '4':
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 0; i++;
break;
case '5':
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 0; i++;
break;
case '6':
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 0; i++;
break;
case '7':
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 0; i++;
break;
case '8':
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 1; i++;
break;
case '9':
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 1; i++;
break;
case 'A':
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 1; i++;
break;
case 'B':
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 1; i++;
break;
case 'C':
b[i] = 0; i++;
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 1; i++;
break;
case 'D':
b[i] = 1; i++;
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 1; i++;
break;
case 'E':
b[i] = 0; i++;
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 1; i++;
break;
case 'F':
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 1; i++;
b[i] = 1; i++;
break;
}
}
return in;
}
int main()
{
std::bitset<80> b;
cin >> b;
cout << b << endl;
system("pause");
return 0;
}程序输出:
9999999999999
00000000000000000000000000000000000010010001100001001110011100101001111111111111
Press any key to continue . . .https://stackoverflow.com/questions/50789423
复制相似问题