2013-10-25 63 views
3

功率給定一個無符號的整數a(小於或等於1024),我需要找到一個數p滿足下列條件:最近的2

  • 最低p >= a
  • p是2的冪

我敢肯定有一個更好的解決方案,使用位運算符。
你有更好的解決方案嗎?

unsigned int closest_pow2(unsigned int a) 
{ 
    if (a == 0 || a > 1024) return 0; //error, never happen 
    if (a == 1) return 1; 
    if (a == 2) return 2; 
    if (a <= 4) return 4; 
    if (a <= 8) return 8; 
    if (a <= 16) return 16; 
    if (a <= 32) return 32; 
    if (a <= 64) return 64; 
    if (a <= 128) return 128; 
    if (a <= 256) return 256; 
    if (a <= 512) return 512; 
    if (a <= 1024) return 1024; 
} 
+4

看看<<操作 –

+0

難道這個問題確實涉及到你有一個實際的問題?那麼,請告訴我們吧! – Wolf

+0

是的,這是考慮到元素降低的數量上GPGPU我的減少算法(點積的部分)所使用的緩衝區的大小。 – Michael

回答

7

下做它沒有相對昂貴的條件語句或循環:

unsigned next_power_of_two(unsigned int x) { 
    x = x - 1; 
    x = x | (x >> 1); 
    x = x | (x >> 2); 
    x = x | (x >> 4); 
    x = x | (x >> 8); 
    return x + 1; 
} 
+0

這可能是快,但它幾乎沒有明確的或可讀(我花了半分鐘,只是爲了找到一個手波浪的說法,這是正確的),不像其他快速(但無可否認依賴於快速'clz'內在)實現。換句話說,我不會稱之爲「更好」。 – delnan

+1

這就是我一直在尋找的解決方案,謝謝! – Michael

+2

我花了更長的時間比@delnan來我的結論是,它的工作原理(剪切 - 粘貼點擊一些無符號整型運行測試),沒有手揮舞雖然。但是,由於選擇了很好的描述性名稱,並且它全部是6行代碼,所以可讀性永遠不會是一個棘手的問題。俏皮。 +1。 – ryyker

0

風格上,我不喜歡使用位運算符,因爲它們往往使代碼難以閱讀 - 它們封裝該位結構比其他類型的命令少得多。即使沒有位運算符,代碼可以作出更簡潔:

int pow = 1; 
if (a == 0 || a > 1024) return 0; 
while (pow < 2000) { 
    if (a <= pow) return pow; 
    pow *= 2; 
} 

如果你不想硬編碼的數字大於比特數最多(可能是一個更好的編碼實踐反正)更大,你可以寫如下:

final int MAX_POSSIBLE_BIT_VALUE = 1024; 

unsigned int closest_pow2(unsigned int a) { 
    if (a == 0 || a > MAX_POSSIBLE_BIT_VALUE) return 0; 
    int pow = 1; 
    while (pow <= MAX_POSSIBLE_BIT_VALUE) { 
    if (a <= pow) return pow; 
    pow *= 2; 
    } 
    return pow; 
} 
0

如果這是一個有趣的問題(因爲我看不出有什麼要求,你必須找到最低 p> = A),那麼這是一個解決方案:

return 1024; 
+0

好點,我編輯我的問題 – Michael