如果我知道整数k = 2^n
,我怎样才能有效地找到n
?
换句话说,如果我知道整数中的一个位被设置,我怎么能得到该位的位置?
一个想法是找到k-1
的汉明重量,但还有其他更简单的方法我不会考虑吗?
答案 0 :(得分:1)
Bit Twiddling Hacks有很多令人惊讶的(并且模糊不清,以性能为导向)的黑客攻击。最适合您使用的似乎是使用乘法和查找。
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];
This page提供了对问题的详细分析,重点是国际象棋编程。
从here复制的答案。 PS:不知道如何在这个问题上给予作者信任,所以就这样写了。