求最接近数n的2的次方数

数据结构与算法 专栏收录该内容
3 篇文章 0 订阅

        我们当然可以直接暴力求解(负次方不考虑):

int findTableSizeof2(const int target){
    if(target < 0) return 0;
    int power = 0, temp = target;
    int temp2power = 1;
    while(1){
        temp/=2; 
        if(temp){
            power++;
            temp2power*=2;
        }else{
            break;
        }
    }
    // 可能出现target是两者的平均值,就暂且返回大值吧
    return temp2power*2 - target >= target - temp2power ? temp2power*2 : temp2power;
        

        但是前段时间看到一个通过位运算求值得方法,实在令人叹为观止:

int findTableSizeof2(const int target){
    int temp = target -1;
    temp |= temp >> 1;
    temp |= temp >> 2;
    temp |= temp >> 4;
    temp |= temp >> 8;
    temp |= temp >> 16;
    return (temp < 0) ? 1 : temp + 1;
}

        乍一看可能有些蒙,我们随便取个值来分析一下,-------就827了(1100111011)。

         1100111011    -1    temp: 1100111010

         0110011101    temp>>1

         1110111111    temp |=    temp: 1110111111    此步主要为了保证第一位一定是1,如果所有位都为1,则已经是结果了

         0011101111     temp >>2

         11111111111    temp |=    temp:1111111111     这样就保证了前两位一定是1,以此类推(虽然已经满足了)保证所有位为1

         。。。。。。

         但是这样并不是我们想要的结果,因为2的次方数只是高位为1,所以我们只需要再+1,就ok了。(这也是前面为什么要减一的原因)。

 

          其实我们平时会遇到太多以2为基数的运算,此时一定要首先考虑位运算,比如以上的算法就会比暴力求解提升几百倍上千倍速度不止。常见的还有求余数运算。比如求对2的余:n%2---> n&1,对8的余:n&7

  • 1
    点赞
  • 1
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:黑客帝国 设计师:白松林 返回首页

打赏作者

王鑫鑫鑫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值