GMPライブラリにGMP変数のbitLengthを与える関数はありますか?
mpz_t temp;
mpz_init(temp);
mpz_set_ui(temp,356678789);
次に、温度のビット長を見つける方法は?
GMPライブラリにGMP変数のbitLengthを与える関数はありますか?
mpz_t temp;
mpz_init(temp);
mpz_set_ui(temp,356678789);
次に、温度のビット長を見つける方法は?
GMP には、それを行うライブラリ関数があります。
size_t mpz_sizeinbase (mpz_t OP, int BASE)
mpz_sizeinbase(temp,2);
を表すのに必要なビット数は次のabs(temp)
とおりです。
指定された BASE の桁数で測定された OP のサイズを返します。BASE は 2 ~ 62 の範囲で指定できます。OP の符号は無視され、絶対値のみが使用されます。結果は、正確または 1 が大きすぎます。BASE が 2 の累乗の場合、結果は常に正確です。OP がゼロの場合、戻り値は常に 1 です。
もっと良い方法があるかもしれませんが、ドキュメントを読んだ後、次の方法を思いつきました。
mp_bitcnt_t msb(mpz_t& m) {
mpz_t n = m.get_moz_t();
mp_bitcnt_t remaining = mpz_popcount(n), last = -1;
while (remaining) {
--remaining;
last = mpz_scan1(n, last + 1);
}
return last;
}