2017-05-30 9 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のコードを理解する助けが必要

+0

そこにある[演算子](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)をすべて知っていますか?これは助けとなる最初のことです;) – AxelH

答えて

2

メソッドの名前は、それが次に近いとあなたは、このコードを自分で実行するprint文を追加しての中間結果を確認する必要があります。2.

の力であるn数よりも大きいを返す通りコード実行。

あなたは、このメソッドの内部で何が起こっていることになるメソッド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 – Oswald

+0

の周りに私の頭をラップすることはできません。 OPはコードが何をするのかを理解する助けを求めた。アルゴリズムがなぜ機能するのかを理解する必要がある場合、時間を費やす必要があります。 – Nurjan

+0

@Oswald。私はNurzhanからの提案の後にこのコードを掘り出します。このコードは2つの演算子の組み合わせです。したがって、nは5になる。次に、2の2進数は1ビットを実行することによって101になり、右側のシフト数は10になり、nはまだ5、すなわち101になる。ビットごとのORを実行すると、101 + 010 = 111、助けてくれてありがとうNurzhan。 –

関連する問題