位运算
ffs(n)
返回从右向左数第几位是1
。n==0
时返回0
constexpr int ffs(int n) noexcept {
return __builtin_ffs(n) - 1;
}
static_assert(ffs(0b11) == 0);
static_assert(ffs(0b10) == 1);
clz(n)
返回前导0
的个数。n==0
时返回未定义
constexpr int clz(unsigned n) noexcept {
// clz: counting leading zeros
return __builtin_clz(n);
}
static_assert(clz(0b10) == 30);
ctz(n)
返回从后数0
的个数,n!=0
时和ffs(n)
的结果相同。n==0
时返回未定义
constexpr int ctz(unsigned n) noexcept {
// ctz: counting tailing zeros
return __builtin_ctz(n);
}
static_assert(clz(0b100) == 2);