【发布时间】:2021-11-12 14:58:30
【问题描述】:
有GMP 类型mpz_t 的mpz_class C++ 包装器。拥有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) 快捷方式。
【问题讨论】:
-
"并减慢代码速度" 如果您编辑答案以向我们展示探查器显示它确实存在并且是您代码中的瓶颈,那就太好了。
-
C API 有
mpz_tdiv_r_2exp:除以 2 的幂并取余数。这就是你想要的,它uses the obvious efficient implementation。似乎值得一试。 -
@Kaihaku 我的代码对这种掩蔽操作很敏感。但是无论如何,当您进行编码时,了解所有最佳可用功能/操作并使用它们是非常好的。这里肯定不需要 AND 操作,您只需将最低 N 位复制到新数字就可以了,不需要 AND。
-
@NateEldredge 谢谢!正是需要的!
标签: c++ c performance bit-manipulation gmp