計算大於或等於正整數的2的冪次方數

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

相關文章
相關標籤/搜索