如何在两个数字之间找到两个完美的力量? 样本输入:0和10 输出:2,4,8
答案 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)
步骤:
n1 = start_of_range
,n2 = end_of_range.
n1
需要多少位。称之为b
。2**b
之后,n1
将成为2的下一个力量。n2
之前的所有两次幂。示例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;
}
}