求最小2的幂

简介

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



你可能感兴趣的:(求最小2的幂)