我在Windows(MSVC 2010)上使用MPIR 2.4.0,並試圖將無符號的64位整數添加到mpz_t數字中。但是,似乎MPIR/GMP不支持64位整數和mpz_t之間的直接轉換。這是否意味着我必須將我的uint64轉換爲字符串並通過mpz_init_set_str讀取? 這也不是非常吸引人,也不看起來很快 - 兩個轉換沒有。將uint64轉換爲GMP/MPIR編號
我錯過了什麼或者在這裏使用什麼技巧/黑客?
乾杯,
菲利普
我在Windows(MSVC 2010)上使用MPIR 2.4.0,並試圖將無符號的64位整數添加到mpz_t數字中。但是,似乎MPIR/GMP不支持64位整數和mpz_t之間的直接轉換。這是否意味着我必須將我的uint64轉換爲字符串並通過mpz_init_set_str讀取? 這也不是非常吸引人,也不看起來很快 - 兩個轉換沒有。將uint64轉換爲GMP/MPIR編號
我錯過了什麼或者在這裏使用什麼技巧/黑客?
乾杯,
菲利普
如建議通過Banthar使用mpz_import,但我建議它不依賴於平臺的字節順序如下:
mpz_import(b, 1, 1, sizeof(a), 0, 0, &a);
是的,如果你是一個平臺(Windows)上不使用LP64模型上,那麼就沒有功能的64位整數分配給mpz_t
。您可以分別指定64位整數的高位和低位,然後將它們相加在一起,而不是通過字符串。仍然不是很乾淨,但幾乎肯定會更快。
編輯:請參閱Banthar的答案爲更好的解決方法。
使用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更新的代碼。
啊,非常好。沒有意識到這個功能。 –
它看起來更好,但你必須處理endianess。我不確定這段代碼是否正確處理它。 –
MPIR 2.4和將intmax_t介紹uintmax_t型支持。請參閱mpz_set_ux()/ sx()和mpz_get_ux()/ sx()。這些功能在GMP中不存在,但記錄在MPIR 2.4.0手冊中。
謝謝,正如斯蒂芬佳能已經說過的:我沒有意識到這個功能,非常有用:)但是我仍然認爲這個大小的庫不考慮int64是很奇怪的:/ –