How can I count the number of leading zeros in a 128-bit integer (uint128_t
) efficiently?
I know GCC\'s built-in functions:
__builti
inline int clz_u128 (uint128_t u) {
uint64_t hi = u>>64;
uint64_t lo = u;
int retval[3]={
__builtin_clzll(hi),
__builtin_clzll(lo)+64,
128
};
int idx = !hi + ((!lo)&(!hi));
return retval[idx];
}
this is a branch free variant. Note that more work is done than in the branchy solution, and in practice the branching will probably be predictable.
It also relies on __builtin_clzll
not crashing when fed 0: the docs say the result is undefined, but is it just unspecified or undefined?