经常会遇到对求比某个整型数大的最小的二的幂的需求, 今天看到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; }