将uint64转换为GMP / MPIR编号

时间:2011-07-06 14:41:55

标签: c++ gmp uint64

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

我是否遗漏了某些东西或者在这里使用的技巧/黑客?

干杯,

菲利普

5 个答案:

答案 0 :(得分:6)

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

mpz_import(b, 1, 1, sizeof(a), 0, 0, &a);

答案 1 :(得分:3)

使用mpz_import

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

编辑:根据Frank's comment更新了代码。

答案 2 :(得分:1)

是的,如果您使用的是不使用LP64模型的平台(Windows),则无法为mpz_t分配64位整数。您可以单独分配64位整数的高半部分和低半部分,然后将它们一起添加,而不是通过字符串。仍然不是很干净,但几乎肯定更快。

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

答案 3 :(得分:1)

在MPIR 3上运行了一些测试后,由于某些原因,在64位值上似乎mpz_import变慢了,下面的方法比较丑陋,但IME表现更好(hint为32位,而lont为UInt64的低32位)

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

如果 hi 部分为空,则当然可以快捷,值得进行测试。

如果它是负的Int64(带符号),请获取Abs,执行上述操作,然后取反mp_size字段。

答案 4 :(得分:0)

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