最近在open GL绘图的时候,遇到须要计算大于或等于这个数的最小的2的幂次方数(next highest power of 2)。由于Texture在显卡上的尺寸为2的幂次方。 html
算法基本原理是将这个数的每一位都置为1,而后+1便可。拿10进制来讲,计算大于或等于573的最小的10幂次方数就是999+1=1000.固然上述的作法对于若是这个数刚好是你所须要的m次方数,就不大好。因此在实际计算的时候会先减去1,再按位或循环右移1位的结果,最后再+1。若是是32位系统须要循环右移5次,若是是64位系统则须要循环右移6次。循环的次数是如何决定的呢?由于每次迭代都会使1的位数翻倍,2的5次方为32,因此对于32位系统须要循环右移5次。同理对于64位系统须要循环右移6次。这种算法的优势是采用移位操做速度比较快,并且相比其余算法不用考虑溢出问题。 java
举例来讲: 算法
153的二进制码为10011001 函数
计算过程以下: ui
10011001-1=10011000 spa
10011000|01001100=11011100 操作系统
11011100|01101110=11111110 .net
11111110|11111111=11111111 unix
11111111|11111111=11111111 code
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,也符合数学上的定义。
http://http://blog.chinaunix.net/uid-14336734-id-3135714.html