C++ Как присвоить тип данных двоичной последовательности?

У меня есть двоичная последовательность. Эта последовательность представляет целое число произвольной точности, но с точки зрения компьютера это просто двоичная последовательность. Я работаю на С++ с библиотекой многоточности. Я знаю только, как присвоить значения произвольному типу данных точности:

mp::cpp_int A = 51684861532215151;

Как я могу взять двоичную последовательность и напрямую присвоить ей тип данных mp::cpp_int? Я понимаю, что могу пройтись по каждому биту и добавить 2^бит, где бы я ни нажал 1, но я стараюсь этого не делать.


ОТВЕТИТЬ:

Галик: Моему компилятору (visual studio 2013) это почему-то не нравится.

mp::cpp_int A = 0b0010011;

Он продолжает ставить красную волнистую линию после первого 0.

Также да, увеличьте мультиточность.


person Benn    schedule 03.11.2016    source источник
comment
Как хранится двоичная последовательность? (и хранится ли он с прямым порядком байтов или с прямым порядком байтов?)   -  person Martin Bonner supports Monica    schedule 03.11.2016
comment
Какую многоточную библиотеку вы используете? (О, и можете ли вы отредактировать свой вопрос с ответами на эти вопросы, а не отвечать в комментариях.)   -  person Martin Bonner supports Monica    schedule 03.11.2016
comment
Достаточно очевидным улучшением было бы интерпретировать двоичную последовательность как последовательность uint64_t. Это не просто в 64 раза эффективнее, но и экономит битовые сдвиги. На немного связанной ноте я не предполагаю никакого знака. Возможно, вам придется выяснить, как это работает для вашей двоичной последовательности.   -  person MSalters    schedule 03.11.2016
comment
Вы пытались использовать бинарный литерал mp::cpp_int A = 0b00110010111001010010010101010?   -  person Galik    schedule 03.11.2016


Ответы (1)


Как создать определенный тип большого целого числа из последовательности необработанных битов, зависит от этого конкретного типа, от различных конструкторов/методов, которые он предлагает для этой цели, и/или от того, какие перегрузки операторов доступны.

Единственные общие механизмы включают в себя создание большого целого числа с битами младшего разряда объемом в одно слово (поскольку такой конструктор доступен почти повсеместно), а затем использование арифметики для вставки битов, по одному биту за раз или битов в одно слово в момент времени. время. Это сводит к минимуму зависимость от реквизитов данного типа и может работать в широком диапазоне типов совершенно без изменений, но довольно громоздко и малоэффективно.

Конкретный тип большого целого числа, показанный в фрагменте вашего кода, выглядит как boost::multiprecision::cpp_int, и Олаф Дитше уже предоставил ссылку на его главная страница документации. Преобразование в и из необработанных двоичных форматов для этого типа задокументировано на странице Импорт и экспорт данных в и из cpp_int и cpp_bin_float, включая примеры кода, такие как инициализация cpp_int из vector<byte>.

person DarthGizka    schedule 09.11.2016