Next: Miscellaneous Integer Functions, Previous: Integer Random Numbers, Up: Integer Functions [Index]
mpz_t
型の変数は,ここで述べる関数を使って任意長のバイナリデータと相互に変換することができます。
opにおけるワードデータの配列をropにインポートして格納します。
パラメータはデータ形式を規定しています。1ワードsizeバイトのcount個分のワードが飲み込まれます。orderが1の場合は最大有効ワードから,-1の場合は最小有効ワードから読み込まれます。ワードはそれぞれendianの値に従い,1の場合は最大有効バイトから,-1の場合は最小有効バイトから,0の場合はホストCPU のエンディアンに従って読み込まれます。各ワードのうち最大有効nailsビット分は読み飛ばされますので,0の場合は全てのワードが読み込まれることになります。
このデータに対しては符号は扱いません。ropは基本的には正数となります。符号についてはアプリケーション側で,例えばmpz_neg
関数を使って付与して下さい。
opについてのデータアラインメントは関係ありませんので,どんなアドレスでも利用可能です。
以下, unsigned long
型の配列に入っているデータを最大有効要素から,ホストのバイトオーダーで値を読み出して変換する例を示します。
unsigned long a[20]; /* z と aを初期化 */ mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a);
この例では,sizeof
バイト分のデータを全て利用しており,unsigned long
型が利用できる環境であれば実行可能です。例外はCrayベクトルマシンで,short
型もint
型も(sizeof
の返り値に従って)8バイトで格納されますが,そのうち32bitもしくは46bit分しか利用しません。nailsが利用できる時にはこの分をカウントして8*sizeof(int)-INT_BIT
bit分だけ渡すようにできます。
ropにopのワードデータを詰め込みます。
パラメータは書き出されるデータ形式を規定しています。1ワードsizeバイトのcount個分のワードが書き出されます。orderが1の場合は最大有効ワードから,-1の場合は最小有効ワードから書き出されます。ワードはそれぞれendianの値に従い,1の場合は最大有効バイトから,-1の場合は最小有効バイトから,0の場合はホストCPU のエンディアンに従って書き出されます。各ワードのうち最大有効nailsビット分は利用されず,ゼロが詰め込まれます。nailsが0場合は全てのワードが書き出されます。
書き出されるワード数は *countp
に格納され,countpがNULL
の場合はワード数をカウントしません。ropは書き出すデータが入る分確保されていなければなりません。ropがNULL
の場合は現状のGMPのメモリ割り当て関数(see Custom Allocation)を使って必要なだけ配列が確保されます。どちらのケースでも,返り値はropか,確保されたメモリブロックへのポインタになります。
opが非ゼロの場合は,書き出される最大有効ワードも非ゼロになります。opがゼロであれば,返されるカウントはゼロで,ropには何も書き出されません。更にropがNULLであれば,メモリブロックは確保されず,NULLが返されます。
opの符号は無視され,絶対値だけがエクスポートされます。アプリケーションが側でmpz_sgn
関数で符号を確認し,必要であればそれを格納しておいて下さい。(see Integer Comparisons)
ropにおけるデータアラインメントの制限はありませんので,どんなアドレスでも利用可能です。
アプリケーション側で必要なメモリ空間を確保するには,次のように必要サイズを計算します。mpz_sizeinbase
関数は常に最小1は返してきますので, このcount
も最小1となり, たとえz
がゼロで実際にはメモリスペースを必要としない場合でも,malloc(0)
となる問題は発生しません。
numb = 8*size - nail; count = (mpz_sizeinbase (z, 2) + numb-1) / numb; p = malloc (count * size);