最近在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