求数的幂

determine power of number

本文关键字:      更新时间:2023-10-16

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

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

一般来说,给定y = n^x,要找到x,您需要使用对数,即x = log_n(y)。大多数语言不提供log_n函数,但您可以使用以下标识实现它:

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

如果yn的整数幂,则x也是整数。当然,由于有限精度计算机算法的限制,使用上述方法不一定能得到确切的答案。

恐怕仅靠一点点魔法是做不到的。比特通常适用于2的幂。例如,对于5的幂,你可能需要在基数为5的系统中操作,其中15=110, 105=510, 1005=2510, 10005=12510, 100005=62510,等等。在以5为基数的系统中,你可以很容易地识别5的幂,就像在二进制中识别2的幂一样。但是你首先需要把你的数字转换成这个基数。

对于任意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
  ...
}
相关文章:
  • 没有找到相关文章