2017-05-30 66 views
2
static long nextPowerOf2(long n) 
{ 
    n--; 
    n |= n >> 1; 
    n |= n >> 2; 
    n |= n >> 4; 
    n |= n >> 8; 
    n |= n >> 16; 
    n++; 
    return n; 
} 

我正在閱讀博客中的Java代碼示例。我正在面對的難以理解這個代碼。請解釋一下這個函數的功能是什麼?需要幫助才能理解java中的一段代碼

+0

你知道那裏的每個[operator](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)嗎?這是第一件事會有所幫助;) – AxelH

回答

2

正如方法的名稱所暗示的,它返回的下一個最近的和大於n數是2。

你需要運行自己這個代碼,添加打印語句,看到的中間結果的力量代碼執行。

如果調用方法nextPowerOf2(6)這究竟會發生的方法裏面:

n--; // n becomes 5; 
n |= n >> 1; // This is equivalent to n = n | n >> 1. 
      // Bit shift >> has higher precedence than bitwise OR |. 
      // This is why it becomes 7. Try it yourself and read about 
      // these operators. 
n |= n >> 2; // n is 7 
n |= n >> 4; // n is 7 
n |= n >> 8; // n is 7 
n |= n >> 16; // n is 7 
n++; // n is 8 
return n; // return n which is equal to 8 - the next nearest to 6 power of 2. 

希望這有助於。

+0

它不難看出這個函數做了什麼,請你解釋一下做n | n << 1和n | n << 2 ..等等的邏輯,我仍然不能包圍我的頭 – Oswald

+0

@Oswald。 OP請求幫助理解代碼的功能。如果你需要理解算法的工作原理,你需要花點時間。 – Nurjan

+0

@Oswald。我從Nurzhan的建議中挖出了這段代碼,這段代碼是兩個運算符的組合,例如我們通過了6然後n--;因此n變爲5.然後,通過執行一位右移數變爲10並且n仍然是5即101,5的二進制數爲101.現在執行按位或運算,我們得到101 + 010 = 111,即7。感謝Nurzhan的幫助。 –