我有一个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);
}
}
有人可以帮忙吗?
答案 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点:
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 .....
}