确定数字的力量

时间:2011-10-15 10:31:42

标签: c++ bit-manipulation

我知道如果数字是2的幂,那么它必须满足(x&(x-1))=0;例如让我们采用x=16 or 10000 x-16=10000-1=01111和(x&(x-1))= 0;对于另一个非幂数7,例如,7=01117-1=0110 7&(7-1)=0110不等于0,我的问题如何确定数字是否是另一个数k的某个幂?例如625是5 ^ 4,我怎么能找到哪个幂等于k到n?我对使用按位运算符很感兴趣,确定我可以通过强力方法找到它(通过标准算法,非常感谢

3 个答案:

答案 0 :(得分:4)

我怀疑你是否会找到一个按位算法来确定一个数是5的幂。

通常,在y = n^x的情况下,要查找x,您需要使用对数,即x = log_n(y)。大多数语言都不提供log_n函数,但您可以使用以下标识来实现它:

log_n(y) = log(y) / log(n)

如果yn的整数幂,那么x将是一个整数。当然,由于有限精度计算机算法的局限性,你不一定能得到上述方法的确切答案。

答案 1 :(得分:2)

我害怕,你不能用简单的魔法来做到这一点。比特通常适用于2的幂。对于5的幂,你可能需要在base-5系统中运行,其中1 5 = 1 10 , 10 5 = 5 10 ,100 5 = 25 10 ,1000 5 = 125 10 ,10000 5 = 625 10 等。在base-5系统中,你可以识别5的幂,就像2的幂一样容易在二进制。但是你首先需要将你的数字转换成那个基数。

答案 2 :(得分:1)

对于任意k,只有通用解决方案:

bool is_pow(unsigned long x, unsigned int base) {
  assert(base >= 2);
  if (x == 0) {
    return false;
  }
  unsigned long t = x;
  while (t % base == 0) {
    t /= base;
  }
  return t == 1;
}

k是2的幂时,您可以通过检查x是否为2的幂以及x的尾随零位数是否可被整除来加快速度log2(k)

如果计算速度很重要且k已修复,您可以随时使用这些简单的实现:

bool is_pow5(unsigned long x) {
  if (x == 5 || x == 25 || x == 125 || x == 625)
    return true;
  if (x < 3125)
    return false;
  // you got the idea
  ...
}