經常會遇到對求比某個整型數大的最小的二的冪的需求, 今天看到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; }
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; }