GCC Bit-scan-forward to find next set bit?

后端 未结 2 1263
离开以前
离开以前 2021-01-21 03:00

I have a uint64_t and I would like to find the index of the first set bit, reset it to zero and find the next set bit.

How do I know when to terminate? BSF

相关标签:
2条回答
  • 2021-01-21 03:33

    The simplest would be to just check the input:

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

    More complicatedly, according to the docs 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.

    Which lets you do:

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

    Which accomplishes the same thing, you just have to repeat the __builtin_ffsll call, so it's more verbose and in my opinion doesn't contribute to clarity.

    0 讨论(0)
  • 2021-01-21 03:43

    2 points to keep in mind when using __builtin_ffs:

    1. in order to get the next bit, you need to clear the recently found bit
    2. if you are planning to use the result, for bit shifting or table indexing, you would most likely need to decrease it by one.
    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 .....
    }
    
    0 讨论(0)
提交回复
热议问题