一尘不染

以前的2的幂

algorithm

关于如何查找给定值2的下一个幂有很多信息(请参阅参考资料),但是我找不到任何一个可以得到前一个2的幂。

到目前为止,我发现的唯一方法是保留一个表,将所有2的幂乘以2 ^ 64,然后进行简单查找。


阅读 153

收藏
2020-07-28

共1个答案

一尘不染

这是我当前的解决方案,用于查找任何给定正整数n的两个的下一个和上一个幂,并且是一个确定数字是否为2的幂的小函数。

此实现适用于Ruby。

class Integer

  def power_of_two?
    (self & (self - 1) == 0)
  end

  def next_power_of_two
    return 1 if self <= 0
    val = self
    val = val - 1
    val = (val >> 1) | val
    val = (val >> 2) | val
    val = (val >> 4) | val
    val = (val >> 8) | val
    val = (val >> 16) | val
    val = (val >> 32) | val if self.class == Bignum
    val = val + 1
  end

  def prev_power_of_two
   return 1 if self <= 0
   val = self
   val = val - 1
   val = (val >> 1) | val
   val = (val >> 2) | val
   val = (val >> 4) | val
   val = (val >> 8) | val
   val = (val >> 16) | val
   val = (val >> 32) | val if self.class == Bignum
   val = val - (val >> 1)
  end
end

使用示例:

10.power_of_two? => false
16.power_of_two? => true
10.next_power_of_two => 16
10.prev_power_of_two => 8

对于前一个2的幂,找到下一个并除以2的速度比上面的方法稍慢。

我不确定Bignums如何运作。

2020-07-28