找出在C中没有循环的x除以2的频率

Nik*_*tio 1 c integer bit-manipulation

我正在寻找一种方法来找到我可以在不使用循环,递归或对数的情况下将常数x除以2(而不是得到余数)的频率.由于这与查找最低有效非零位的索引的问题相同,我希望有一些方法可以使用按位运算来执行此操作.不幸的是我无法想出来.有任何想法吗?

背景:我有一个循环,在每次迭代时将计数器加倍,直到它不再除以常数x.我想要展开这个循环,但NVIDIA CUDA编译器不够聪明,无法计算迭代次数,所以我想重写循环,使得迭代次数对编译器来说变得更加明显:

for(i=1; CONST & i == 0; i *= 2)
     bla(i);
Run Code Online (Sandbox Code Playgroud)

应该变得像

#define ITERATIONS missing_expr_with_CONST
for(i=0; i < ITERATIONS; i++)
     fasel(i);
Run Code Online (Sandbox Code Playgroud)

Cod*_*her 7

这可以使用此代码直接解决32位数字(我没有信用).

unsigned int v;  // find the number of trailing zeros in 32-bit v 
int r;           // result goes here
static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = MultiplyDeBruijnBitPosition[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];
Run Code Online (Sandbox Code Playgroud)