我在Windows上使用MPIR 2.4.0(MSVC 2010),我试图将无符号的64位整数添加到mpz_t数字。但是,似乎MPIR / GMP不支持64位整数和mpz_t之间的直接转换。这是否意味着我必须将我的uint64转换为字符串并通过mpz_init_set_str读取? 这既不是很有吸引力,也不是很快 - 两次转换都没有。
我是否遗漏了某些东西或者在这里使用的技巧/黑客?
干杯,
菲利普
答案 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手册中有记录。