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