【问题标题】:determine power of number确定数的幂
【发布时间】:2011-10-15 10:31:41
【问题描述】:

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

【问题讨论】:

  • 您的问题应该是关于数字的“对数”,而不是“幂”。

标签: c++ bit-manipulation


【解决方案1】:

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

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

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

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

【讨论】:

  • 在确定 x 之后,您可以简单地检查 n^((int)x),以确保。
  • @Faust:确实。虽然您可能想要舍入而不是截断。
【解决方案2】:

恐怕,你不能用简单的魔法来做到这一点。位通常适用于 2 的幂。例如,对于 5 的幂,您可能需要在 base-5 系统中运行,其中 15=110, 105=510, 1005=2510, 10005= 12510, 100005=62510 等。在 base-5 系统中,您可以像识别 2 的幂一样容易地识别 5 的幂在二进制。但是您首先需要将您的数字转换为该基数。

【讨论】:

    【解决方案3】:

    对于任意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
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2020-07-26
      相关资源
      最近更新 更多