思想很简单,就是找出当前数的二级制中最大位为1位的位置,然后用1左移位数即可。

比如数据5,它的二进制形式为101,最高位为1的位置是3,然后左移3位,等于1000,即数字8。也就是数字8是5的接近的2的整数次幂。

思想很简单,最主要的任务就是找到最高位为1的位置。这个有专门的AT&T汇编指令bsrl。这个指令是个32位指令,位置范围是0到31。

如果bsrl %eax 5的范围结果是2,所以我们在用它的时候加1即可。当然0是需要考虑的,我们把它的值赋值成-1,这样函数结果的范围就编程1到32。具体实现如下:

static inline int fls(int x)
{
    int r;

__asm__("bsrl %1,%0\n\t"
            "jnz 1f\n\t"
            "movl $-1,%0\n"
            "1:" : "=r" (r) : "rm" (x));
    return r+1;
}

当然,如果不用汇编也是可以实现的,我们用C语言来实现它。就是不断左移,直到数值为0,记下它左移的次数,既是它最高位为1的位置。

static inline int fls(int x)
{
int position;
int i;
if(0 != x)
{
for (i = (x >> 1), position = 0; i != 0; ++position)
           i >>= 1;
}
else
{
        position = -1;
}
    return position+1;
}

最后把要得到的数字用1左移那么多次数,即可。考虑到0的特殊性,我们把数字都减1,其他都不会受影响,这样0会取值成-1,然后取到的位置为32,1左移32位后还是为0。

实现代码如下:

static inline unsigned int roundup_pow_of_two(unsigned int x)
{
    return 1UL << fls(x - 1);
}

求最接近的最大2的指数次幂roundup_pow_of_two分析与实现相关推荐

  1. JS求最接近5的倍数

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

  2. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

  3. R语言指数平滑预测法分析南京出租车打车软件空载率时间序列补贴政策可行性...

    报告链接:http://tecdat.cn/?p=32161 本文通过建立空载率的数学模型,帮助客户来分析出租车的空载率,从而对出租车补贴政策能否提高高峰期的实载率,缓解打车难问题进行了说明(点击文末 ...

  4. Algorithm:C++语言实现之求最大连续子数组(暴力法、分治法、分析法、动态规划法)

    Algorithm:C++语言实现之求最大连续子数组(暴力法.分治法.分析法.动态规划法) 目录 求最大连续子数组 T1.code暴力法  O(n3) T2.分治法   O( n*log(n) ) T ...

  5. 数据科学导引——各国幸福指数聚类数据集的分析

    各国幸福指数聚类数据集的分析 注:这里能不粘贴截图的我将不会粘贴截图,因为复制到学习通提交的时候我这边还要再弄一次图很麻烦,但是没数据谢老师又不能直观的看到. 1.观察数据 各国幸福指数数据集的介绍: ...

  6. 【期权系列】基于偏度指数的择时分析

    [期权衍生指标系列]基于偏度指数的择时分析 本篇文章是基于研究报告的复现作品,旨在记录个人的学习过程和复现过程中的一些思路. 感谢中信期货研究员前辈的宝贵思路. 一.偏度指数 1.偏度指数简介 偏度是 ...

  7. js 求最接近5的倍数的值

    在数组中获取最接近的5的倍数的值 注:data为数组 1.最大值–向上取整 Math.ceil(Math.max.apply(null, data) / 5) * 5 2.最小值–向下取整 Math. ...

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

    我们当然可以直接暴力求解(负次方不考虑): int findTableSizeof2(const int target){if(target < 0) return 0;int power = ...

  9. 求最接近cap的2次幂(tableSizeFor函数的实现)

    不比cap小的2次幂(HashMap中的tableSizeFor函数) // 初始化临界值的具体实现 static final int tableSizeFor(int cap) {int n = c ...

最新文章

  1. java.lang.SecurityException Permission Denial opening provider ngyb.createdatabase.AccountProvider
  2. valid floating point value什么意思_每个位置的球员,都在干些什么
  3. python自动抢红包软件_快过年啦,还怕手速慢,我用Python自动抢红包!
  4. 竟然有如何奇葩的如厕方式......
  5. Flask mysql 模版传参_Flask渲染Jinja2模板和传参
  6. 又一个绝对棒的对话框插件fancybox v1.3.4
  7. code的bootstrap如何有提示 vs_如何用DataFocus对Excel表中数据进行分析?
  8. telnet黑屏就是通_黑屏的智能农贸市场竟通过验收?市场监管部门:工作力度不够 | 电视问政...
  9. 更换Homebrew为中科大源
  10. 上海计算机三级网络,上海市计算机三级网络技术
  11. 《数字图像处理(第三版)》 第一章 绪论 笔记
  12. 新手初步--Springmvc
  13. BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(这是我写过最骚气的dp!)
  14. 关于高通8953修改动态logo bootanimation不起作用问题
  15. layui.laydate默认当前时间时分秒
  16. Apache Avro 入门
  17. 模糊查询银行卡号mysql_mysql模糊查询
  18. windows中定时操作(SetTimer函数用法)
  19. go-viper实践
  20. decorate怎么读(decorated怎么读)

热门文章

  1. unity游戏解包和修改代码
  2. 波长分别为640/670nm和609/640nm的BODIPY荧光染料
  3. 解决onenote绘图内置笔无压感问题
  4. matlab simulink求稳态误差ess blog,基于Simulink控制系统的稳态误差分析
  5. 联通iphone 4s 没有蜂窝数据设置菜单,无法正常发彩信
  6. 文本编辑工具之vim使用介绍
  7. 推荐一个快速证件照换底色的工具超级好用
  8. Java私活200元,完成JavaSwing学生成绩管理系统(三)
  9. MySQL创建用户(3种方式)
  10. 【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分2/3 -图像显示原理-UI卡顿掉帧