簡體   English   中英

將 uint64 轉換為 GMP/MPIR 編號

[英]Convert uint64 to GMP/MPIR number

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

我錯過了什么或者這里使用的技巧/黑客是什么?

干杯,

菲利普

正如 Banthar 建議的那樣使用 mpz_import,但我建議以下不依賴於平台字節序的方法:

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

使用mpz_import

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

編輯:根據弗蘭克的評論更新代碼。

是的,如果您在不使用 LP64 model 的平台 (Windows) 上,則沒有 function 可以將 64 位mpz_t a 分配給。 您可以單獨分配 64 位 integer 的高半部分和低半部分,然后將它們加在一起,而不是通過字符串。 仍然不是很干凈,但幾乎可以肯定更快。

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

在 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部分是 null,當然可以使用快捷方式,值得一試。

如果是負 Int64(有符號),則獲取 Abs,執行上述操作,然后對 mp_size 字段取反。

MPIR 2.4 引入了對 intmax_t 和 uintmax_t 的支持。 請參閱 mpz_set_ux()/sx() 和 mpz_get_ux()/sx()。 這些函數在 GMP 中不存在,但記錄在 MPIR 2.4.0 手冊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM