Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Importing and Exporting Data to and from cpp_int and cpp_bin_float

Boost , Chapter 1. Boost.Multiprecision , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Любой тип целого числа, который использует<cpp_int_backend>в качестве уровня реализации, может импортировать или экспортировать биты с помощью двух функций, не являющихся членами:

template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
          expression_template_option ExpressionTemplates, class OutputIterator>
OutputIterator export_bits(
   const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,
   OutputIterator out,
   unsigned chunk_size,
   bool msv_first = true);
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
          expression_template_option ExpressionTemplates, class Iterator>
number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
   import_bits(
      number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,
      Iterator i,
      Iterator j,
      unsigned chunk_size = 0,
      bool msv_first = true);

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

template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator,
          expression_template_option ExpressionTemplates, class OutputIterator>
OutputIterator export_bits(
   const number<const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val,
   OutputIterator out,
   unsigned chunk_size,
   bool msv_first = true);

Экспортирует абсолютную стоимость<val>в OutputIterator<out>. Функция будет записывать<chunk_size>бит за раз в OutputIterator, и если<msv_first>верно, то сначала запишет самый значимый блок. Байтовый и битовый порядок в каждом<chunk_size>блоке всегда находится в машинном формате. При этом каждый из них должен быть в состоянии<boost::uintmax_t>.

[Note] Note

К сожалению, концепция OutputIterator стандарта не предоставляет средств для вывода типа на выход, поскольку<std::iterator_traits<OutputIteratorType>::value_type>является типом<void>. Вот почему количество битов для каждого блока должно быть указано вручную. Это также может привести к предупреждениям компилятора о сужении значения.

[Tip] 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] Note

Обратите внимание, что эта функция оптимизирована для случая, когда данные могут быть мемкопированы из источника в целое число - в этом случае оба итератора являются указателями, и все должно быть малоэндианным.

Examples

В этом простом примере мы импортируем / экспортируем биты 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);
}

PrevUpHomeNext

Статья Importing and Exporting Data to and from cpp_int and cpp_bin_float раздела Chapter 1. Boost.Multiprecision Tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:21:57/0.0044879913330078/0