2011-03-31 23 views
1

如何找到兩個數字之間的完美力量? 採樣輸入:0和10 輸出:2,4,8兩個數字之間的完美力量

+0

這是一個功課題嗎? – templatetypedef 2011-03-31 11:43:38

+6

爲什麼你的預期產出不是1? – 2011-03-31 11:43:45

+0

雅我們可以加1也;那不是問題 – 2011-03-31 11:46:57

回答

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

找到第一個數字中設置爲1的最高位,比如它位於位置x從最低位開始計數。然後找到第二個數字中設置爲1的最高位,比如位於y。數字2 X + 1,2 X + 2 ...,2 ÿ是你要找的

+0

我們可以做這個沒有一個while循環 – 2011-03-31 11:46:22

+2

@Ajay,如果你有這樣的要求,請更新您的問題。 – Muggen 2011-03-31 11:47:36

+0

@Ajay:好吧,不,你需要一個循環來找到最高位集 – 2011-03-31 11:47:41

1

您可以用數字的二進制表示和輸出所有的號碼之間的數字其中只有一個位被設置:

0 = 00000000 
10 = 00001010 

=> 

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

所以你的問題歸結爲尋找比最小的兩個較大的,然後第一動力左移,而你小於最大值。或者,除了最高值之外,將所有設置位置於最大值中,然後在大於最小值時向右移位。

+0

亞這我已經知道如何可以找到這些數字有位設置爲一。爲此我必須執行一個循環,我有沒有任何方法來執行這個任務沒有循環 – 2011-03-31 11:49:36

+1

@Ajay:因爲你的輸出總是會是多個數字,你將永遠不得不使用循環或至少類似於循環(fe遞歸的方法將是可能的,但這沒有多大意義)。 – schnaader 2011-03-31 11:54:04

0

步驟:

  1. 比方說n1 = start_of_rangen2 = end_of_range.
  2. 瞭解需要多少位來表示n1。稱它爲b
  3. 現在2**b將在n1之後成爲下一個二次冪。
  4. 從這裏應該很容易計算出所有的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() 
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; 
} 
}