4

我在 Windows (MSVC 2010) 上使用 MPIR 2.4.0,我试图将一个无符号的 64 位整数添加到一个 mpz_t 数字。但是似乎 MPIR/GMP 不支持 64 位整数和 mpz_t 之间的直接转换。这是否意味着我必须将我的 uint64 转换为字符串并通过 mpz_init_set_str 读取?这既不是很吸引人,也不是看起来很快——两次转换都是徒劳的。

我错过了什么或者这里使用的技巧/黑客是什么?

干杯,

菲利普

4

5 回答 5

6

正如 Banthar 建议的那样使用 mpz_import,但我建议以下不依赖于平台字节序的方法:

mpz_import(b, 1, 1, sizeof(a), 0, 0, &a);
于 2011-07-06T20:58:35.533 回答
3

使用mpz_import

void mpz_set_ull( mpz_t rop, unsigned long long op )
{
   mpz_import(rop, 1, 1, sizeof(op), 0, 0, &op);
}

编辑:根据弗兰克的评论更新代码。

于 2011-07-06T20:49:05.187 回答
2

是的,如果您在不使用 LP64 模型的平台(Windows)上,则没有将 64 位整数分配给mpz_t. 您可以分别分配 64 位整数的高半部分和低半部分,然后将它们加在一起,而不是遍历字符串。仍然不是很干净,但几乎可以肯定更快。

编辑:请参阅Banthar 的答案以获得更好的解决方法。

于 2011-07-06T20:44:22.043 回答
1

在 MPIR 3 上运行一些测试后,由于某种原因,mpz_import 在 64 位值上似乎较慢,下面的方法更丑陋,但 IME 表现更好(hi 是更高的 32 位,lo 是 UInt64 的低 32 位)

 mpz_set_ui(dest, hi);
 mpz_mul_2exp(dest, dest, 32);
 mpz_add_ui(dest, lo);

如果hi部分为空,您当然可以使用快捷方式,值得进行测试。

如果是负 Int64(有符号),则获取 Abs,执行上述操作,然后对 mp_size 字段取反。

于 2020-08-18T16:16:25.157 回答
0

MPIR 2.4 引入了对 intmax_t 和 uintmax_t 的支持。请参阅 mpz_set_ux()/sx() 和 mpz_get_ux()/sx()。这些函数在 GMP 中不存在,但记录在 MPIR 2.4.0 手册中。

于 2011-07-08T16:16:04.137 回答