2011-07-06 13 views
3

Windows(MSVC 2010)でMPIR 2.4.0を使用していて、mpz_t番号に符号なし64ビット整数を追加しようとしていました。しかし、MPIR/GMPは64bit整数とmpz_tの間の直接変換をサポートしていないようです。これは私のuint64を文字列に変換し、mpz_init_set_str経由でこれを読む必要があるのでしょうか? これは非常に魅力的でもないし、それは非常に速く見えない - 何も2つの変換。uint64をGMP/MPIR番号に変換する

私は何かが恋しい、またはここで使用するトリック/ハックは何ですか?

乾杯、

フィリップ

答えて

5

。 mpz_set_ux()/ sx()とmpz_get_ux()/ sx()を参照してください。これらの機能はGMPには存在しませんが、MPIR 2.4.0マニュアルに記載されています。

+0

スティーブン・キヤノンは既に言っています:私はこの機能を認識していませんでしたが、非常に便利です:)しかし、私はまだこのサイズのライブラリがint64を考慮しないと奇妙だと思っています: –

1

あなたはLP64モデルを使用していないプラットフォーム(Windowsの場合)にしている場合は、[はい、その後に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); 
} 

EDIT:コードFrank's commentに応じて更新。

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

ああ、非常にいいです。この機能を認識していませんでした。 –

+0

それはよりよく見えますが、あなたはエンディアンを扱わなければなりません。私はこのコードが正しく処理するかどうかはわかりません。 –

0

MPIR 2.4がintmax_t型およびuintmax_tのサポートが導入されました:mpz_importを使用Bantharによって提案されたが、私は、プラットフォームのエンディアンに依存しない次のことをお勧めしたいと

関連する問題