求最小2的冪

簡介

       經常會遇到對求比某個整型數大的最小的二的冪的需求, 今天看到snort的sfxhash.c中的實現方法很好,因而與以往本身經常使用的接口一塊兒寫出來作一對比.ui

實現spa

本身的實現

以下所見
1.檢驗參數是否已經是2的冪很有價值
2.求解最近的2的冪的數時間很槽糕

/**
 * @brief 肯定某數是否爲2的冪
 * @param[in] x 輸入數據            
 * @return 1是, 0 否
 */
#define CHECKPOW(x)                 ( (x & (x - 1)) ? 0 : 1)


/**
 * @brief  求距離該數最近的2的冪
 * @param[in] size          實際空間大小
 * @return                  轉換後的大小                                                       
 *
 */
static inline uint_32 pow1(const uint_32 size) {
    unsigned int  i = 1, j;
    if(size <= 0) 
        return -1;         /* <= 0 不處理*/   

    j = size;
    if(!CHECKPOW(j)) {   
        while(j){
            j >>= 1;                   
            i  <<= 1;
        }
        return i;
    }
    return size;
}

snort中的實現

1.該代碼未校驗是否輸入爲2的冪
2.但求取輸入最近的二的冪卻很高效,倍增計算的思想.

static int sfxhash_nearest_powerof2(int nrows)
{
    unsigned i;
    nrows -= 1;
    for(i=1; i<sizeof(nrows) * 8; i <<= 1)
        nrows = nrows | (nrows >> i);
    nrows += 1;

    return nrows;
}
相關文章
相關標籤/搜索