有mpz_class
c++ GMP型mpz_t
包装器。有mpz_class
数字,什么是最有效的方法来采取N
最低位创建另一个mpz_class
数字?
当然我可以做下面的遮罩操作
size_t N = 273; // how many lo bits to take
mpz_class x = ... ; // fill with something...
mpz_class mask = (mpz_class(1) << N) - 1; // mask having N 1-bits
mpz_class result = x & mask; // final result, N lowest bits taken
但是这种屏蔽需要大量不必要的位操作,并且降低了代码的速度。也许有像result = x.take_lo(N);
这样的快捷方式?
也有可能mpz_class
缺乏这样的快捷方式,但至少可能C API有这个功能?因为任何mpz_class
都可以很容易地在没有开销的情况下转换为C类型mpz_t
到mpz_t c_num = x.get_mpz_t();
。所以对我来说,只有在C API中有.take_lo(N)
快捷方式是很好的。
虽然mpz_class
没有c++操作符重载或函数,但您确实可以使用:mpz_tdiv_r_2exp
由C API提供。例如,
mpz_tdiv_r_2exp(result.get_mpz_t(), x.get_mpz_t(), N);
注:cdiv
和fdiv
变体也可用。
使用mp_bitcnt_t
作为(N)
的类型,或者使用static_cast<mp_bitcnt_t>(N)
作为参数,将会更加健壮——因为mp_bitcnt_t
似乎被无条件地定义为unsigned long
,而可能与size_t
不匹配。