2011-07-06 55 views
3

我在Windows(MSVC 2010)上使用MPIR 2.4.0,並試圖將無符號的64位整數添加到mpz_t數字中。但是,似乎MPIR/GMP不支持64位整數和mpz_t之間的直接轉換。這是否意味着我必須將我的uint64轉換爲字符串並通過mpz_init_set_str讀取? 這也不是非常吸引人,也不看起來很快 - 兩個轉換沒有。將uint64轉換爲GMP/MPIR編號

我錯過了什麼或者在這裏使用什麼技巧/黑客?

乾杯,

菲利普

回答

5

如建議通過Banthar使用mpz_import,但我建議它不依賴於平臺的字節順序如下:

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

謝謝,正如斯蒂芬佳能已經說過的:我沒有意識到這個功能,非常有用:)但是我仍然認爲這個大小的庫不考慮int64是很奇怪的:/ –

1

是的,如果你是一個平臺(Windows)上不使用LP64模型上,那麼就沒有功能的64位整數分配給mpz_t。您可以分別指定64位整數的高位和低位,然後將它們相加在一起,而不是通過字符串。仍然不是很乾淨,但幾乎肯定會更快。

編輯:請參閱Banthar的答案爲更好的解決方法。

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更新的代碼。

+0

啊,非常好。沒有意識到這個功能。 –

+0

它看起來更好,但你必須處理endianess。我不確定這段代碼是否正確處理它。 –

0

MPIR 2.4和將intmax_t介紹uintmax_t型支持。請參閱mpz_set_ux()/ sx()和mpz_get_ux()/ sx()。這些功能在GMP中不存在,但記錄在MPIR 2.4.0手冊中。