我想用一个128 bit integer using g++和GMP的mpz_class
(或mpz_t
)来做这个:
typedef unsigned __int128 tw_limb_t;
mpz_class a = "1234567890123456789012345678901234567890";
tw_limb_t b = ...;
a += b;
我可以执行以下操作,但首先将__int128
转换为mpz_t
似乎很慢:
typedef unsigned __int128 tw_limb_t;
inline mpz_class& operator+=(mpz_class &lhs, const tw_limb_t &rhs) {
if (sizeof(tw_limb_t) != 2 * sizeof(mp_limb_t)) {
throw std::runtime_error("sizeof(tw_limb_t) is not twice sizeof(mp_limb_t)");
}
const int LIMB_BITLEN = sizeof(mp_limb_t) * 8;
mpz_class rhs_mpz = (mp_limb_t) (rhs >> LIMB_BITLEN);
rhs_mpz <<= LIMB_BITLEN;
rhs_mpz += (mp_limb_t) rhs;
lhs += rhs_mpz;
return lhs;
}
如何从中获得更高的性能?
1条答案
按热度按时间ttp71kqs1#
这是我目前使用Marc Glisse建议的
mpz_roinit_n
的最佳解决方案。