Читать большое число Base-10 произвольного размера в бит - PullRequest
0 голосов
/ 11 июня 2018

Я хочу прочитать число base10 из строки или стандартного набора в битовый набор.Есть ли какая-либо стандартная функция, чтобы сделать это, или я должен реализовать это сам?

Пример:

bitset<4> buffer;
cin >> buffer;
cout << buffer;

Вход: 5

Выход: 0101

Примечание: мне нужно поддерживать любой ввод длины, если он умещается внутри набора битов

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете использовать библиотеку boost multiprecision для хранения целого числа произвольного размера, а затем обработать его для получения двоичного вывода.

Ниже приведен код, который использует библиотеку, конвертирует в hex с использованием преобразования std :: hex и затем читает hexпоток и выходной двоичный поток.Я перегружен >> для набора битов для чтения большого десятичного числа в поток битов.<< выводит правильный двоичный вывод, как и ожидалось.Вы можете использовать любой размер набора битов (кратный 4), он должен работать.Грубо говоря, проверка ошибок должна быть сделана так, чтобы она не пересекла размер набора битов.Вероятно, вы можете начать с этой версии. </p>

#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 . . .
0 голосов
/ 11 июня 2018

Вы можете просто использовать конструктор std::bitset:

bitset( unsigned long val );

Обратите внимание, что в случае, если вы не предоставите достаточно битов, результат будет содержать наименее значимые N битов.

Например,

std::bitset<2> set(5);
std::cout << set << std::endl;

01 (вместо 101)

...