16

我想知道是否有任何其他 SO 可以推荐一个好的轻量级固定大小整数类型(128 位甚至 256 位,甚至可能是模板参数化)库。

我看过 GMP 和 co,他们非常关心,但对于我的目的来说有点太大了,我现在对简单的仅标头解决方案感兴趣。性能很重要,目标架构将是 x86 和 x86-64,也是一个合理的许可证(也不是 GPL 或 LGPL)。

4

5 回答 5

11

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;
于 2015-02-25T02:29:28.280 回答
2

Xint库目前正在接受审查以成为 Boost 的一部分。尽管讨论颇有争议,审查结果尚不清楚,但该库满足您的一些要求:

  • 仅标头
  • 合理的许可

审查期间讨论的要点之一是性能。如果被接受为官方 Boost 库,我希望性能问题能够得到及时解决。

所以我会试一试:代码文档

于 2011-03-09T10:00:37.533 回答
1

您可以使用 boost(在 1.76.0 上测试):

#include <cstdint>
#include <iomanip>
#include <iostream>

#include <boost/multiprecision/cpp_int.hpp>

using uint512_t  = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512,  512,  boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>;
using uint1024_t = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<1024, 1024, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>;
using uint2048_t = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<2048, 2048, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>;
using uint4096_t = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<4096, 4096, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>;
using uint8192_t = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<8192, 8192, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>;

int main()
{
  uint8192_t u(2U);

  for (int64_t i = 0; i < 4096 - 1; i++) {
      u *= 2;
  }

  std::cout << u << std::endl;
} 
于 2021-08-20T19:54:52.033 回答
0

某些平台上提供了一些本机 128 位类型,您往往会受到架构的限制。例如__m128可用于 SSE2?

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

__int128也在此 ABI 中列出:

http://www.x86-64.org/documentation/abi-0.99.pdf

uint128_t然而,和的首选命名uint256_t可以在 SHOGUN 中找到,这是一个“特别关注支持向量机 (SVM) 的大型机器学习工具箱”

http://www.shogun-toolbox.org/doc/index.html

于 2011-03-09T09:20:46.283 回答
0

根据您的要求,STL 类bitset可能适合您的需要。它响应整数类型所做的所有位操作运算符(<<|),但不幸的是不响应像+or之类的算术运算符*。它的大小在编译时通过模板参数固定。另一个不幸的事情是,API 没有提供获取底层二进制表示的方法(例如用于流式传输),这可能会严重限制它的实用性。

(我知道这是一个老问题,但这个答案可能对其他人有所帮助。)

于 2014-07-14T02:40:18.970 回答