假設我們試圖從某個無符號變數中洗掉尾隨零。
uint64_t a = ...
uint64_t last_bit = a & -a; // Two's complement trick: last_bit holds the trailing bit of a
a /= last_bit; // Removing all trailing zeroes from a.
我注意到手動計算位和移位更快。(啟用優化的 MSVC 編譯器)
uint64_t a = ...
uint64_t last_bit = a & -a;
size_t last_bit_index = _BitScanForward64( last_bit );
a >>= last_bit_index
假設編譯器內在_BitScanForward64速度比任何替代方案都快,是否有任何進一步的快速技巧可以使這更快?
uj5u.com熱心網友回復:
在 x86上,如果可用(它可用于 BMI 指令集),則它是_tzcnt_u64的更快替代。_BitScanForward64
此外,您可以直接在輸入上使用它,您不需要隔離最低位集,正如@AlanBirtles 在評論中指出的那樣。
除此之外,可以對單個變數進行注釋。對于它們的陣列,可能有一個 SIMD 解決方案。
uj5u.com熱心網友回復:
您可以使用std::countr_zero(c 20) 并依靠編譯器對其進行優化。
a >>= std::countr_zero(a);
(獎勵:您不需要指定寬度,它適用于任何無符號整數型別)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422646.html
標籤:
上一篇:Kotlin集合操作的有效性
