关于如何查找给定值2的下一个幂有很多信息(请参阅参考资料),但是我找不到任何一个可以得到前一个2的幂。
到目前为止,我发现的唯一方法是保留一个表,将所有2的幂乘以2 ^ 64,然后进行简单查找。
这是我当前的解决方案,用于查找任何给定正整数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如何运作。