有效地取GMP mpz_t最低N位



mpz_classc++ 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_tmpz_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);

注:cdivfdiv变体也可用。

使用mp_bitcnt_t作为(N)的类型,或者使用static_cast<mp_bitcnt_t>(N)作为参数,将会更加健壮——因为mp_bitcnt_t似乎被无条件地定义为unsigned long,而可能与size_t不匹配。

最新更新