有mpz_class C 包裝器的GMP型別mpz_t。有了mpz_class號,什么是最有效的方法來取其N的最低位來創建另一個mpz_class號?
當然,我可以做以下的屏蔽操作
size_t N =273。//多少個lo位要采取。
mpz_class x = ... ; //span> 填充東西.../span>
mpz_class mask = (mpz_class(1) < < N) - 1; //掩碼有N個1位元。
mpz_class result = x & mask; //最終結果,取N個最低位。
但是這種掩碼需要很多不必要的位和操作,并使代碼變慢。也許有一些捷徑,比如result = x.take_lo(N);?
也有可能mpz_class缺乏這樣的快捷方式,但至少可能C API有這樣的功能?因為任何mpz_class都可以通過mpz_t c_num = x.get_mpz_t();輕松轉換為C型別的mpz_t。所以對我來說,只在C語言API中使用.take_lo(N)的快捷方式就可以了。
uj5u.com熱心網友回復:
盡管對于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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326836.html
標籤:
上一篇:使用連接查詢JSONB列以通過參考外部查詢的子查詢進行過濾
下一篇:檢查字串是否是陣列之一
