C ++ 128/256-битные целочисленные типы фиксированного размера - PullRequest
10 голосов
/ 09 марта 2011

Мне было интересно, может ли кто-нибудь из SO рекомендовать хорошую легковесную библиотеку целочисленного типа с фиксированным размером (128-битную или даже 256-битную, возможно даже параметризованную по шаблону).

Я взглянул на GMP и co, они великолепны, но они слишком велики для моих целей, на данный момент меня интересуют простые решения только для заголовков. Производительность важна, и целевой архитектурой будут x86 и x86-64, а также разумная лицензия (ничего не говоря о GPL или LGPL).

Ответы [ 4 ]

3 голосов
/ 25 февраля 2015

Библиотека Boost имеет типы данных как часть библиотеки multiprecision, для типов в диапазоне от 128 до 1024 бит.

#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int128_t mySignedInt128 = -1;
uint128_t myUnsignedInt128 = 2;
int256_t mySignedInt256 = -3;
uint256_t myUnsignedInt256 = 4;
int512_t mySignedInt512 = -5;
uint512_t myUnsignedInt512 = 6;
int1024_t mySignedInt1024 = -7;
uint1024_t myUnsignedInt1024 = 8;
2 голосов
/ 09 марта 2011

Библиотека Xint в настоящее время находится под рецензией , чтобы стать частью Boost. Несмотря на то, что обсуждается довольно спорно и результаты обзора пока не ясно, библиотека выполняет некоторые из ваших требований:

  • только заголовок
  • разумная лицензия

Одним из моментов, которые обсуждаются в ходе обзора, является производительность. Если я буду принят в качестве официальной библиотеки Boost, я ожидаю, что проблемы с производительностью будут решены быстро.

Итак, я бы попробовал: Код , Документация .

0 голосов
/ 14 июля 2014

В зависимости от ваших требований, класс STL bitset может соответствовать вашим потребностям.Он отвечает на все операторы битовых манипуляций, которые делают целочисленные типы (<<, | и т. Д.), Но, к сожалению, не на арифметические операторы, такие как + или *.Его размер фиксируется во время компиляции с помощью параметра шаблона.Еще одна неприятная вещь заключается в том, что API не предоставляет возможности получить доступ к базовому двоичному представлению (например, для его потоковой передачи), что может серьезно ограничить его полезность.

(я знаю, что это старый вопрос, но этот ответ можетпомогать другим.)

0 голосов
/ 09 марта 2011

Некоторые родные 128-битные типы доступны на определенных платформах, вы, как правило, ограничены архитектурой. Например, __m128 доступно для SSE2?

http://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx

Также указан как __int128 в этом ABI:

http://www.x86 -64.org / документация / ABI-0.99.pdf

Однако предпочтительные названия uint128_t и uint256_t можно найти в SHOGUN, «крупномасштабном наборе инструментов машинного обучения с акцентом на особенно опорных векторных машинах (SVM)» *

http://www.shogun -toolbox.org / док / index.html

...