求最小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;
}



转载于:https://my.oschina.net/u/572632/blog/288325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值