我正在使用位扫描转发来检测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);
}
答案 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);