介紹
輸入一個值码党,計算出一個比它大的為2的冪的數(shù)德崭。
思路
所有為2的冪的數(shù),它的二進制數(shù)表示永遠只有一位為1揖盘,其它都是為0
- 2o:00000001
- 21:00000010
- 22:00000100
- 23:00001000
- ...
代碼
int nextPowerOf2(int n) {
n -= 1;
n |= n >>> 16;
n |= n >>> 8;
n |= n >>> 4;
n |= n >>> 2;
n |= n >>> 1;
return n + 1;
}
目的是把n - 1
從最高位為1的位開始到最低位的所有位全都變成1
眉厨,最后加1
進位,以達到目的兽狭。
注:如果
n
本身已經是2的冪憾股,只運行移位就會得到n * 2
,所以先減1箕慧。如果n
是0服球,減1就是-1,對應的無符號數(shù)為位數(shù)全為1的數(shù)销钝,加1結果是0有咨。
附 - 判斷一個數(shù)是否為2的冪
算法1
所有為2的冪的數(shù)琐簇,它的二進制數(shù)表示永遠只有一位為
1
蒸健,其它都是為0
,將這個數(shù)減去1
后婉商,僅有的那個1
會變?yōu)?code>0似忧,而原來的那n個0
會變?yōu)?code>1。如原來的數(shù)'n'
為00100000
丈秩,'n-1'
為00011111
盯捌。因此,將原來的數(shù)與減去1后的數(shù)字進行與運算后為零蘑秽。
public static boolean isPowerOf2(int n) {
return (n & n - 1) == 0;
}
算法2
所有為2的冪的數(shù)饺著,它的二進制數(shù)表示永遠只有一位為
1
,其它都是為0
肠牲,這個數(shù)的補碼是1
位位置前面的位全部變?yōu)?code>1幼衰,1
位位置后面的位全部變?yōu)?code>0。如原來的數(shù)'n'
為00100000
缀雳,'-n'
為11100000
渡嚣。因此,將原來的數(shù)與原來的數(shù)的補碼進行與運算后為原來的數(shù)不變。
public static boolean isPowerOf2(int n) {
return (n & -n) == n;
}