你可以消除n中的至少顯著位,直到n爲2的冪你可以使用位運算符,並與n和n-1,其中將消除n的最低顯著位,直到N將是2的冪。如果原來N將是2的電源,然後你必須做的是1
public class MathPow{
public int largestPowerOf2(int n){
if((n & n-1) == 0){ //this checks if n is a power of 2
n--; //Since n is a power of 2 we have to subtract 1
}
while((n & n-1) != 0){ //the while will keep on going until n is a power of 2, in which case n will only have 1 bit on which is the maximum power of 2 less than n. You could eliminate the != 0 but just for clarity I left it in
n = n & n-1; //we will then perform the bitwise operation AND with n and n-1 to eliminate the least significant bit of n
}
return n;
}
}
說明減少N:
當你有一個數n(不是2的冪)時,小於n的2的最大冪總是n中的最高有效位。在n是2的冪的情況下,小於n的2的最大冪是在n中唯一的位之前的位。
例如,如果我們有8(其是2的第三功率),其二進制表示爲1 00 0是粗體將是2最大功率N之前。既然我們知道每個二進制數字代表2的冪,那麼如果我們有n是2的冪數,那麼2的最大冪就是2之前的冪,這將是位在n之前的唯一一點之前。
對於數n,這不是2的冪,並且不是0,我們知道在二進制表示中,n將會有不同的位,這些位將僅表示各種冪的和其中重要的是最重要的一點。那麼我們可以推斷出n只是最重要的位加上一些其他的位。由於n是以一定長度的比特來表示的,而最重要的比特是2的最大冪,所以我們可以用這個比特數來表示,但它也是我們可以用那麼多比特來表示的最小數目,那麼我們可以得出結論:最重要的比特是比n更低的2的最高冪,因爲如果我們增加另一比特來表示下一個2的冪,那麼我們將具有大於n的2的冪。
實施例:
例如,如果我們有168(其爲二進制10101000)的同時將採取168和減1,其爲167(這是在二進制10100111)。然後我們會在兩個數字上進行按位與。 例子:
10101000
& 10100111
------------
10100000
我們現在有二進制數10100000.如果我們減去1從它和我們使用的位與兩個數字,我們拿到千萬爲128,這是2〜7的動力。
實施例:
10100000
& 10011111
-------------
10000000
如果n是爲原本是2的冪然後我們必須從n個減去1。例如,如果n爲16,即二進制爲10000,那麼我們將減去1,這將使我們得到15,即二進制爲1111,並且我們將它存儲在n中(這就是if)。然後,我們進入按位運算符AND與n和n-1(它將是15(二進制1111)012(二進制1110))的時間。
實施例:
1111
& 1110
--------
1110
現在我們留下14.然後,我們執行按位與具有n和n-1,它是14(二進制1110)& 13(二進制1101)。
例子:
1110
& 1101
---------
1100
現在我們有12個,我們只需要消除最後一個至少顯著位。再次,我們在n和n-1上執行按位AND,它是12(二進制1100)和11(二進制1011)。
例
1100
& 1011
--------
1000
我們最後剩下8這是2級不少於16
什麼不添加'System.out.println(res);'在'while'中查看'res'的值? – johnchen902
是否爲預期輸入?還是1? – harold