我想知道是否有任何其他 SO 可以推荐一个好的轻量级固定大小整数类型(128 位甚至 256 位,甚至可能是模板参数化)库。
我看过 GMP 和 co,他们非常关心,但对于我的目的来说有点太大了,我现在对简单的仅标头解决方案感兴趣。性能很重要,目标架构将是 x86 和 x86-64,也是一个合理的许可证(也不是 GPL 或 LGPL)。
该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;
您可以使用 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;
}
某些平台上提供了一些本机 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) 的大型机器学习工具箱”
根据您的要求,STL 类bitset
可能适合您的需要。它响应整数类型所做的所有位操作运算符(<<
等|
),但不幸的是不响应像+
or之类的算术运算符*
。它的大小在编译时通过模板参数固定。另一个不幸的事情是,API 没有提供获取底层二进制表示的方法(例如用于流式传输),这可能会严重限制它的实用性。
(我知道这是一个老问题,但这个答案可能对其他人有所帮助。)