博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算大于或等于正整数的2的幂次方数
阅读量:5783 次
发布时间:2019-06-18

本文共 1340 字,大约阅读时间需要 4 分钟。

hot3.png

      最近在open GL绘图的时候,遇到需要计算大于或等于这个数的最小的2的幂次方数(next highest power of 2)。因为Texture在显卡上的尺寸为2的幂次方。

      算法基本原理是将这个数的每一位都置为1,然后+1即可。拿10进制来说,计算大于或等于573的最小的10幂次方数就是999+1=1000.当然上述的做法对于如果这个数恰好是你所需要的m次方数,就不大好。所以在实际计算的时候会先减去1,再按位或循环右移1位的结果,最后再+1。如果是32位系统需要循环右移5次,如果是64位系统则需要循环右移6次。循环的次数是如何决定的呢?因为每次迭代都会使1的位数翻倍,2的5次方为32,所以对于32位系统需要循环右移5次。同理对于64位系统需要循环右移6次。这种算法的优点是采用移位操作速度比较快,而且相比其他算法不用考虑溢出问题。

举例来说:

153的二进制码为10011001

计算过程如下:

10011001-1=10011000

10011000|01001100=11011100

11011100|01101110=11111110

11111110|11111111=11111111

11111111|11111111=11111111

11111111|11111111=11111111

11111111+1=100000000

100000000的10进制数即为256.符合要求。

如下是32位操作系统的一个实现:

public static int nextPowerOf2(int n) {        n -= 1;        n |= n >>> 16;        n |= n >>> 8;        n |= n >>> 4;        n |= n >>> 2;        n |= n >>> 1;        return n + 1;    }

另外说明一下,如果传进去的值为1,那么函数将返回1.也是对的。因为2的0次方为1.所以也符合数学上的定义。

判断一个数是否为2的幂次方。

算法的基本原理是因为正整数的原码和补码是一样的。而这个正整数对应的负整数的补码是这个数的反码+1.正整数的原码与这个数的负整数的补码,如果和这个数相同, 那么 这个数就是2的幂次方。

举例来说:

128的原码为 0000...10000000.

-128的补码为1111..10000000.

按位与之后的结果为0000...10000000等于0000...10000000

176的原码为 0000...10110000.

-176的补码为1111...01010000.

按位与之后的结果为0000...00010000不等于0000...10110000。

public static boolean isPowerOf2(int n) {         return (n & -n) == n;    }
另外,传进去去的值为1,那么返回为true,也是正确的。因为2的0次方为1,也符合数学上的定义。

转载于:https://my.oschina.net/shaorongjie/blog/132543

你可能感兴趣的文章
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
vue-cli项目打包需要修改的路径问题
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
[SpringBoot] - 配置文件的多种形式及优先级
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>
debian7 + wheezy + chromium + flashplayer
查看>>
AOP
查看>>
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>
uva 11468 - Substring(AC自己主动机+概率)
查看>>
Mysql 数据备份与恢复,用户创建,授权
查看>>
沉思录
查看>>
Angular.js中的$injector服务
查看>>
构建之法读书笔记01
查看>>
linux - lsof 命令最佳实践
查看>>
kafka性能测试
查看>>
现实世界的Windows Azure:h.e.t软件使用Windows Azure削减50%的成本
查看>>
深入.net框架
查看>>