c++ - GCC 位扫描向前查找下一个设置位?

标签 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);
    }
}

有人可以帮忙吗?

最佳答案

最简单的就是检查输入:

while (input) {
    int32_t index = __builtin_ffsll(input);
    // do stuff
}

更复杂,根据文档 the docs :

— Built-in Function: int __builtin_ffs (int x)
Returns one plus the index of the least significant 1-bit of x, or if x is zero, returns zero.

这让您可以:

for (int index  = __builtin_ffsll(input); 
     index; 
     index = __builtin_ffsll(input))
{
    // do stuff
}

它完成同样的事情,你只需要重复 __builtin_ffsll 调用,所以它更冗长,在我看来无助于清晰。

关于c++ - GCC 位扫描向前查找下一个设置位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792365/

相关文章:

c++ - 非常适合 Xeon-phi 众核架构的应用程序

c++ - session 之间未正确恢复 CMFCToolbar 布局

c++ - 由于 C++03/C++11 中指针数组的常量性而导致的链接错误

c - 局部变量在栈上的分配顺序

c++ - 无法理解宏定义(将常量转换为类指针)

c++ - 如何消除 GCC 中的外部库/第三方警告

c++ - GCC 相当于 MSVC 中的/GS、/GL、/Gy、/Oi、/MD

java - 将 Baillie–PSW 测试从 Python 转换为 Java

c - 为什么此代码无法按预期工作

java - 签署了积极的近乎完美的散列