两个数字之间的两个完美的力量

时间:2011-03-31 11:42:30

标签: algorithm

如何在两个数字之间找到两个完美的力量? 样本输入:0和10 输出:2,4,8

6 个答案:

答案 0 :(得分:3)

在第一个数字中找到设置为1的最高位,比如它位于从最低位开始计数的位置x。然后找到第二个数字中设置为1的最高位,比如它位于y位置。数字2 x + 1 ,2 x + 2 ...,2 y 是您正在寻找的数字

答案 1 :(得分:1)

您可以使用数字的二进制表示,并输出仅设置一位的所有数字:

0  = 00000000
10 = 00001010

=>

     00000001 (1)
     00000010 (2)
     00000100 (4)
     00001000 (8)

所以你的问题减少到找到大于最小值的2的第一个幂,然后在你小于最大值时向左移动。或者,取消设置除最高值之外的所有设置位,然后在大于最小值时向右移动。

答案 2 :(得分:1)

有趣的部分是“如何得到2的最大功率小于或等于我的上限”,2的最低功率大于或等于下限。

而且,没有循环就可以轻松完成。对于无符号32位数字:

floor(x):   ; floor power of 2
    x = x | (x >> 1)
    x = x | (x >> 2)
    x = x | (x >> 4)
    x = x | (x >> 8)
    x = x | (x >> 16)
    return x - (x >> 1)

ceil(x):   ; ceiling power of 2
    x = x - 1
    x = x | (x >> 1)
    x = x | (x >> 2)
    x = x | (x >> 4)
    x = x | (x >> 8)
    x = x | (x >> 16)
    return x + 1

虽然你不会绕过输出数字的循环,但是很好。

答案 3 :(得分:0)

在达到0之前你可以进行多少次移位?

答案 4 :(得分:0)

步骤:

  1. 我们说n1 = start_of_rangen2 = end_of_range.
  2. 找出代表n1需要多少位。称之为b
  3. 2**b之后,n1将成为2的下一个力量。
  4. 应该很容易计算到n2之前的所有两次幂。
  5. 示例python代码:

    #!/usr/bin/python
    def get_bits(n):
        b = 0
        while n:
            n = n / 2
            b += 1
        return b
    
    def get_power_of_two_in_range(n1, n2):
        b = get_bits(n1)
        x = 2**b
        res = []
        while x < n2:
            res.append(x)
            x = x * 2
        return res
    
    def main():
        print get_power_of_two_in_range(0, 10)
    
    if __name__ == '__main__':
        main()
    

答案 5 :(得分:0)

int first=0; //**first number which is a complete power of 2 in the range!**
 for(i=low;i<high;i++){
  if(2i==(i^(i-1)+1)){
   first=i;
   break;
  }
 }

while(first!=0){
 print first;
 first*=2;
 if(first>high){
  break;
}
}
相关问题