4

Windows (MSVC 2010) で MPIR 2.4.0 を使用しており、mpz_t 番号に符号なし 64 ビット整数を追加しようとしていました。ただし、MPIR/GMP は 64 ビット整数と mpz_t の間の直接変換をサポートしていないようです。これは、uint64 を文字列に変換し、これを mpz_init_set_str で読み取る必要があるということですか? これはあまり魅力的ではなく、非常に速く見えるわけでもありません.2回の変換は無駄です.

何か見逃していましたか、それともここで使用するトリック/ハックは何ですか?

乾杯、

フィリップ

4

5 に答える 5

6

Banthar が提案したように mpz_import を使用しますが、プラットフォームのエンディアンに依存しない次のことをお勧めします。

mpz_import(b, 1, 1, sizeof(a), 0, 0, &a);
于 2011-07-06T20:58:35.533 に答える
3

mpz_importを使用します。

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

編集:フランクのコメントに従ってコードが更新されました。

于 2011-07-06T20:49:05.187 に答える
2

はい、LP64 モデルを使用しないプラットフォーム (Windows) を使用している場合、64 ビット整数を に割り当てる関数はありませんmpz_t。文字列を調べる代わりに、64 ビット整数の上位半分と下位半分を別々に割り当ててから、それらを足し合わせることができます。まだきれいではありませんが、ほぼ間違いなく高速です。

編集:より良い回避策については、 Banthar の回答を参照してください。

于 2011-07-06T20:44:22.043 に答える
0

MPIR 2.4 では、intmax_t および uintmax_t のサポートが導入されました。mpz_set_ux()/sx() および mpz_get_ux()/sx() を参照してください。これらの関数は GMP には存在しませんが、MPIR 2.4.0 マニュアルに記載されています。

于 2011-07-08T16:16:04.137 に答える