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

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

求最接近数n的2的次方数相关推荐

  1. python【蓝桥杯vip练习题库】ADV-185五次方数(枚举)

    试题 算法提高 五次方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+3 ...

  2. [蓝桥杯][算法提高VIP]五次方数-枚举

    题目描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+32+1024=1057 有这样一些神奇的数,它的五次方数就是它自己,而且这样的数竟 ...

  3. [Java] 蓝桥杯ADV-185 算法提高 五次方数

    问题描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+32+1024=1057 有这样一些神奇的数,它的五次方数就是它自己,而且这样的数竟 ...

  4. JS求最接近5的倍数

    已知某数X,求最接近的5的倍数, 思路:X/5取余数,余数向上取整,然后再乘5, var x=19; var multiple = Math.ceil(X/5)*5; 已知某数组myArray,用坐标 ...

  5. matlab求被21整除,用matlab求[100,999]之间能被21整除的数的个数,还有建立一个字符串向量,删除大写字母._...

    怕散!|用户:的问题 用 matlab求[100,999]之间能被21整除的数的个数,还有建立一个字符串向量,删除大写字母. Promise丶陌影|用户:问问回答: clc;clear; m=0; f ...

  6. C语言试题二十四之编写一个函数unsigned function(unsigned w),w使一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回。

    1. 题目 请编写一个函数unsigned function(unsigned w),w使一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回. 比如:w是1 ...

  7. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

  8. 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2

    已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...

  9. 求一个有序整数数组中和为K的数的对数

    题目: 求一个有序整数数组中和为K的数的对数. 解决方案: 两个指针,一个在头,一个在尾: 大则-,小则加. 延伸题目: (1)求整数数组中和为K的对数. 先排序,O(N*logN),在按照以上算法查 ...

最新文章

  1. 图像切割之(一)概述
  2. 成功解决No such file or directory: site-packages\\pyyaml-5.3-py3.6-win-amd64.egg\\EGG-INFO\\top_level.t
  3. OpenGL 漫反射辐照度 Diffuse irradiance
  4. 拓端tecdat|使用R语言随机波动模型SV处理时间序列中的随机波动率
  5. Atitit 概念还是技术更重要
  6. python简单地实现几个小代码
  7. 动态规划(Dynamic Programming)算法与LC实例的理解
  8. java如何获取hostid_将Unix hostid转换为Java
  9. 【数学建模】2021 年全国大学生数学建模竞赛A题一等奖获奖论文
  10. python数字替换 携程校招
  11. dejavu项目笔记
  12. 一张图理解线性空间,度量空间,赋范空间,巴拿赫空间,内积空间,欧几里得空间,希尔伯特空间
  13. 礼物帮手-论文(不全)
  14. echarts+高德地图设置卫星图层
  15. DQL、DML、DDL、DCL全称及含义
  16. 线性代数学习笔记8-2:对称矩阵和Hermitian矩阵、共轭转置、正定矩阵
  17. pytorch-自我使用笔记
  18. python中英文书籍汇总,总有一本是你想要的
  19. SSL证书不会安装配置?手把手教会你,3步搞定
  20. win7打开桌面计算机很慢,win7电脑开机慢怎么办

热门文章

  1. Javascript机器学习教程
  2. touchstart、touchmove、touchend关于兼容性问题
  3. 企业网站建设有什么作用?
  4. Code::blocks的安装以及使用方法
  5. Repository not found,fatal: repository https://github.com/xxx/xxxxxxx/ not found
  6. HttpClient别说话,用心看
  7. Gartner:自建大数据安全分析平台恐难逃失败厄运!
  8. 摆脱厄运!你该怎么做?
  9. docker保存和载入镜像
  10. cf1451D. Circle Game(圆圈博弈、数学、博弈总结)