如何找到n,其中k = 2 ^ n

时间:2015-03-21 06:46:34

标签: c++ c

如果我知道整数k = 2^n,我怎样才能有效地找到n? 换句话说,如果我知道整数中的一个位被设置,我怎么能得到该位的位置?

一个想法是找到k-1的汉明重量,但还有其他更简单的方法我不会考虑吗?

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:不知道如何在这个问题上给予作者信任,所以就这样写了。