简介
常常会遇到对求比某个整型数大的最小的二的幂的需求, 今天看到snort的sfxhash.c中的实现方法很好,于是与以往自己常用的接口一起写出来做一对比.
实现
自己的实现
如下所见
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;
}