isPowerOf2

计算大于或等于正整数的2的幂次方数

断了今生、忘了曾经 提交于 2020-04-07 02:04:18
最近在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