有没有一种快速的方法来获取二进制值中等于 1 的位的索引?

Kea*_*uan 3 c++ algorithm bit-manipulation bitwise-operators

我想以二进制格式获取等于 1 的索引,现在我使用如下代码:

inline static uint8_t the_index(uint32_t val){
  return uint8_t(log(val & ((~val) + 1))/log(2));
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否还有其他方法可以达到相同的目标?有没有可能用位运算来解决这个问题呢?

我这样做是为了迭代一个值并构建一些取决于迭代位置的操作,伪代码如下所示:

 while (temp) {
            auto cur_index = the_index(temp);
            auto window = ((1 << i) - 1) << cur_index;
            if (((temp & window) ^ window) == 0) {
              //....do something
            }
            temp &= temp - 1;
        }
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 7

为此有一个标准函数:

auto cur_index = std::countr_zero(temp);
Run Code Online (Sandbox Code Playgroud)

在我的系统上,这编译为:

xor     eax, eax
tzcnt   eax, edi
Run Code Online (Sandbox Code Playgroud)

请注意,无论输入是否恰好有一个设置位,此函数都会成功计算从右到第一个位的零位。