比特没有被重置?

时间:2015-09-26 02:42:37

标签: c++ bit-manipulation bit

我正在使用位扫描转发来检测unit64_t中的设置位,使用程序中的每个设置位索引,清除设置位然后继续查找下一个设置位。但是,当初始uint64_t值为:

  

0000000000001000000000000000000000000000000000000000000000000000

以下代码不会重置第52位,因此它会陷入while循环:

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

2 个答案:

答案 0 :(得分:2)

来自the docs

  

- 内置功能:int __builtin_ffs (int x)
  返回一加x的最低有效1位的索引,或者如果x为零,则返回零。

你的明确功能只是一个人,它应该是:

clearNthBitOf64(bits64, index-1);

您的clear功能也在溢出。你需要确保你移动的东西足够大:

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

答案 1 :(得分:0)

__builtin_ffsll&#34;返回一个加上x的最低有效1位的索引,或者如果x为零,则返回零。&#34;您需要将左移调整为~(1ULL << (n - 1))或将函数调用更改为clearNthBitOf64(bits64, index - 1);