user997112
user997112

Reputation: 30615

Bits aren't being reset?

I am using Bit Scan Forward to detect set bits within a unit64_t, use each set bit index within my program, clear the set bit and then proceed to find the next set bit. However, when the initial uint64_t value is:

0000000000001000000000000000000000000000000000000000000000000000

The below code isn't resetting the 52nd bit, therefore it gets stuck in the while loop:

uint64_t bits64 = data;

//Detects index being 52
int32_t index = __builtin_ffsll(bits64);

while(0 != index){

    //My logic

    //Set bit isn't being cleared here
    clearNthBitOf64(bits64, index);

    //Still picks-up bit 52 as being set
    index = __builtin_ffsll(bits64);
}

void clearNthBitOf64(uint64_t& input, const uint32_t n) {
    input &= ~(1 << n);
}

Upvotes: 1

Views: 101

Answers (2)

ShadowRanger
ShadowRanger

Reputation: 155418

__builtin_ffsll "returns one plus the index of the least significant 1-bit of x, or if x is zero, returns zero." You need to adjust the left shift to ~(1ULL << (n - 1)) or change the function call to clearNthBitOf64(bits64, index - 1);

Upvotes: 0

Barry
Barry

Reputation: 303077

From 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.

You're simply off by one on your clear function, it should be:

clearNthBitOf64(bits64, index-1);

Also your clear function is overflowing. You need to ensure that what you're left shifting is of sufficient size:

void clearNthBitOf64(uint64_t& input, const uint32_t n) {
    input &= ~(1ULL << n);
    //          ^^^
}

Upvotes: 2

Related Questions