表示128位数字 C++

如何最好地呈现128位数 C++? 它必须尽可能接近内置数值类型。 /即支持所有算术运算符等。/.

我想到了创建一个会有的课程 2 64 bit 或者 4 32位数字。 或者,也许只是创建一个128位的内存块,并自己做所有事情。

有什么更简单的/当它实现自己时,我不太可能破坏的标准方法? :/

如果它可以扩展到256位,512位等,它也会很好......
已邀请:

莫问

赞同来自:

EDIT:

当我第一次写作
http://www.boost.org/doc/libs/ ... .html
还没有。 通过历史原因保持这种答案。

我已经做了一堂课 uint128 以前,您可以查看:
http://www.codef00.com/code/uint128.h
.

这取决于 boost 自动提供数学运算符的所有变体,因此它必须支持制作本机类型的所有内容
unsigned int

.

内置类型有一些轻微的堤防,例如使用类似于此的字符串初始化它:


uint128_t x/"12345678901234567890"/;


有一个方便的宏与那些类似的宏 C99, 您可以使用以下哪种:


uint128_t x = U128_C/12345678901234567890/;

石油百科

赞同来自:

这是一个小小的案例,特别是因为你没有指定哪个平台/S./ 你正在寻找但是 GCC 您可以使用所谓的内容 mode /TI/, 获得 /合成/ 例如,128位操作:


typedef unsigned int uint128_t __attribute__//mode/TI///;

uint64_t x = 0xABCDEF01234568;
uint64_t y = ~x;

uint128_t result = //uint128_t/ x * y/;

printf/"6llX * 6llX -> ", x, y/;

uint64_t r1 = /result >> 64/;
uint64_t r2 = result;

printf/"6llX 6llX\n", r1, r2/;


但是,它仅适用于处理器。 64-bit.

一种或另一个方式,您可以查看多种精度的算法来解决这个问题。 mode /TI/ 制作编译器为您生成操作,否则它们必须明确写入。

您可以使用公共包。 bigint; 那些我知道的人 C++, 包括数字理论包
http://www.cdc.informatik.tu-d ... iDIA/

http://www.shoup.net/ntl/
, 以及包裹 bigint, 用于加密码 Crypto++ 和 Botan /. 另外,当然,有 GnuMP, 这是一个规范图书馆 C MPI /她也有一个贝壳 C++, 虽然我最后一次看着她,但她似乎记录了差不多/. 所有这些都是为了快速工作,但也可能配置为大 /1000+ 页/ 数字所以什么时候 128 您可以处理大的架空成本。 /另一方面,你没有说这个值是否有/. 和所有人 /与包装形成鲜明对比 bigint-cpp, 这是 GPL, 要么 BSD, 或者 LGPL/ - 不确定这个值是否是,但它可能非常重要。

您还可以编写自定义类型类型 uint128_t; 通常这个类销售几乎与通常的阶级相同的算法。 MPI, 只严格编码只有 2 或者 4 元素。 如果您想知道如何实施此类算法,则是一个很好的参考
http://www.cacr.math.uwaterloo ... 4.pdf
当然,如果您真的不需要所有算术运算,请执行此操作 /师和模块,特别是非常复杂/. 例如,如果您只需要追踪仪表,那么可以假设溢出 64 你可以把它作为一对夫妇呈现 64 bit 长长并手动进行转移:


unsigned long long ctrs[2] = { 0 };

void increment// {
++ctrs[0];
if/!ctrs[0]/ // overflow
++ctrs[1];
}


当然,与谁更容易处理共同的包裹 MPI 或用户类 uint128_t.

知食

赞同来自:

看看已经开发的其他图书馆。 很多人都想在你之前做到。: D

尝试
http://sourceforge.net/projects/cpp-bigint/

江南孤鹜

赞同来自:

Boost 在库中有数据类型
multiprecision

对于范围内的类型 128 到 1024 页。


#include <boost cpp_int.hpp="" multiprecision="">

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>

卫东

赞同来自:

GCC
https://gcc.gnu.org/onlinedocs ... .html
128位整数类型,适用于支持它的处理器。 您可以访问它:


__int128 a;
unsigned __int128 b;


更新 02020-02-10: 根据
https://quuxplusone.github.io/ ... gral/
: GCC, Clang 和 Intel ICC 支持内置类型 _ _ int128.

帅驴

赞同来自:

你可能想要尝试
http://www.gmplib.org/

奔跑吧少年

赞同来自:

不要发明自行车 - 我相信其他人已经解决了这个问题,虽然我不能从一开始就调用任何决定。
http://gmplib.org/
, 当然,它可以解决你的问题,尽管整数固定大小是不必要的,以及稍微繁琐的使用 /这是一个图书馆 C, 但不是 C++/.

快网

赞同来自:

您可能需要更好地使用整数类的无限精度,而不是一系列越来越大的尺寸。 某种语言 /例如, Common Lisp 和 IIRC Python/ 他们最初拥有它们。 我不确定开始,可用于 C++; 我上次看过,没有版本 Boost.

裸奔

赞同来自:

这是我发现的图书馆 google.

http://sourceforge.net/projects/cpp-bigint/
/

冰洋

赞同来自:

图形库 cairo 包含两个实现便携式128位整数算法的文件: cairo-wideint-private.h, cairo-wideint.c. 我们仅包括我们项目中的这两个元素来获得128位。

窦买办

赞同来自:

在 Visual Studio C++ 有一种类型 FLOAT128, 它用于表示128位整数。 它实施如下:


#if defined/_M_IA64/ && !defined/MIDL_PASS/
__declspec/align/16//
#endif
typedef struct _FLOAT128 {
__int64 LowPart;
__int64 HighPart;
} FLOAT128;


因此,我不确定它的数学运营是实现的

要回复问题请先登录注册