GCC位扫描转发以查找下一个设置位?

时间:2015-09-26 00:22:44

标签: c++ gcc bit-manipulation bit

我有一个uint64_t,我想找到第一个设置位的索引,将其重置为零并找到下一个设置位。

我如何知道何时终止?全零的BSF未定义......

const uint64_t input = source;

if(0 != input){

    int32_t setIndex = GCC_BSF_INTRINSIC(input);

    while(setIndex != UNDEFINED???){

        //Do my logic

        //Reset
        input[setIndex] = 0;

        setIndex = BSF_Variant(input);
    }
}

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

最简单的方法就是检查输入:

int __builtin_ffs (int x)

更复杂的是,根据文档the docs

  

- 内置功能:for (int index = __builtin_ffsll(input); index; index = __builtin_ffsll(input)) { // do stuff }
  返回一个加上x的最低有效1位的索引,如果x为零则返回,返回零

让你这样做:

__builtin_ffsll

哪个完成同样的事情,你只需要重复{{1}}电话,所以它更加冗长,而且我认为无助于清晰度。

答案 1 :(得分:0)

使用__builtin_ffs时要记住2点:

  1. 为了获得下一位,您需要清除最近找到的位
  2. 如果您打算将结果用于位移或表索引编制,则很可能需要将其减少一。
while (m) {
    // Get the rightmost bit location. 

    int BitOffset = __builtin_ffs(m);

    // Clear the bit before the next iteration. 
    // Used in the loop condition.

    m = (m >> BitOffset) << BitOffset;

    // Do your stuff .....
}