2015-10-06 61 views
3

我分配了大量緩衝區,然後將其分成多個大小的塊。這些尺寸以32開頭,然後每增加一個乘以2。將無符號整數舍入爲2的冪的序列

struct Node 
{ 
    Node*   Next; 
    void*   Data; 
    const unsigned Size; 
}; 

Node* m_Buffers[16]; 

這意味着在m_Buffers[0]緩衝器將大小爲32,並在m_Buffers[1]緩衝器將大小爲64的等。

還有一個函數,它接收一個數字並返回一個指定數字可以取整的大小的緩衝區。

void * GetBuffer(unsigned size) 
{ 
    // ... 
} 

例如,如果我要求384所涉及的緩衝器然後我需要能夠圓,在512和從m_Buffers[4]返回的緩衝器。

到目前爲止,我使用的是循環圍捕:

void * GetBuffer(unsigned size) 
{ 
    unsigned buffer_size = 32; 

    while (buffer_size < size) 
    { 
     buffer_size *= 2; 
    } 

    // ... 
} 

不過我很好奇,如果有圍捕,不涉及一個循環的更好的方法。而且,如果有辦法將舍入的數字轉換爲數組中的索引而不使用switch語句。

說實話,我甚至不確定標題是否正確。所以我爲此道歉。

回答

6

您可以使用this bit triddling hack爲:

unsigned int v; 
v--; 
v |= v >> 1; 
v |= v >> 2; 
v |= v >> 4; 
v |= v >> 8; 
v |= v >> 16; 
v++; 

的想法是「粘貼」在比MSB本身,產生了許多形式的下所有位置v-1最顯著位(MSB) 2 k -1。之後,數字遞增以達到最終結果。

1

您可以使用函數來確定2的下一個冪,而不循環。看到這個鏈接:

Next Power of 2