![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Importing and Exporting Data to and from cpp_int and cpp_bin_floatBoost , Chapter 1. Boost.Multiprecision , Tutorial
|
![]() |
Note |
---|---|
К сожалению, концепция OutputIterator стандарта не предоставляет средств для вывода типа на выход, поскольку< |
![]() |
Tip |
---|---|
Если вы экспортируете в неродную компоновку байтов, используйтеBoost.Endianдля создания пользовательского OutputIterator, который изменяет порядок байтов каждого фрагмента до фактического хранения результата. |
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class ForwardIterator> number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& import_bits( number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, ForwardIterator i, ForwardIterator j, unsigned chunk_size = 0, bool msv_first = true);
Импорт битов из диапазона итераторов[i,j]и хранение их в<val
>для получения неподписанного результата (если результат должен быть подписан, вам нужно будет обрабатывать это отдельно). Когда<msv_first
>истинно, берет<*i
>как самый значительный кусок. Предположим, что в каждом значении, считываемом из диапазона итератора, есть<chunk_size
>бит, и что они находятся в машинном порядке бит/байт. Когда<chunk_size
>равно нулю, то предполагается, что каждый фрагмент содержит<std::numeric_limits<std::iterator_traits<ForwardIterator>::value_type>::digits
>, обратите внимание, что это даст неправильный результат, если отступление от итераторов приведет к типу с подписьюи, бит знака является значительным (будьте особенно осторожны, если вы ожидаете, что тип<char
>будет содержать 8-битные значения, поскольку по умолчанию он будет извлекать только 7-битов за раз, если<char
>подписан). Как и при экспорте, если внешние данные должны быть в неродном байт-порядке (в пределах каждого куска), то вам нужно будет создать адаптер итератора, который представляет его в родном порядке (см.Boost.Endian).
![]() |
Note |
---|---|
Обратите внимание, что эта функция оптимизирована для случая, когда данные могут быть мемкопированы из источника в целое число - в этом случае оба итератора являются указателями, и все должно быть малоэндианным. |
В этом простом примере мы импортируем / экспортируем биты cpp_int в вектор 8-битных неподписанных значений:
#include <boost/multiprecision/cpp_int.hpp> #include <iostream> #include <iomanip> #include <vector> #include <iterator> int main() { using boost::multiprecision::cpp_int; // Create a cpp_int with just a couple of bits set: cpp_int i; bit_set(i, 5000); // set the 5000'th bit bit_set(i, 200); bit_set(i, 50); // export into 8-bit unsigned values, most significant bit first: std::vector<unsigned char> v; export_bits(i, std::back_inserter(v), 8); // import back again, and check for equality: cpp_int j; import_bits(j, v.begin(), v.end()); assert(i == j); }
Импорт или экспорт cpp_bin_float подобен, но мы должны исходить из промежуточного целого числа:
#include <boost/multiprecision/cpp_bin_float.hpp> #include <iostream> #include <iomanip> #include <vector> #include <iterator> int main() { using boost::multiprecision::cpp_bin_float_100; using boost::multiprecision::cpp_int; // Create a cpp_bin_float to import/export: cpp_bin_float_100 f(1); f /= 3; // export into 8-bit unsigned values, most significant bit first: std::vector<unsigned char> v; export_bits(cpp_int(f.backend().bits()), std::back_inserter(v), 8); // Grab the exponent as well: int e = f.backend().exponent(); // Import back again, and check for equality, we have to procede via // an intermediate integer: cpp_int i; import_bits(i, v.begin(), v.end()); cpp_bin_float_100 g(i); g.backend().exponent() = e; assert(f == g); }
Статья Importing and Exporting Data to and from cpp_int and cpp_bin_float раздела Chapter 1. Boost.Multiprecision Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |