このコードは何を意味し、ビットシフトを使用せずに同じことを達成する他の方法は何ですか?
if ($n & ($n - 1))
この数式は、数値が2の累乗であるかどうかを確認します(記述されている条件が真の場合、数値は2の累乗ではありません)。
別の言い方をすれば、テストは、のバイナリ表現に複数の「1」ビットが設定されているかどうかを確認します$n
。ビットがゼロまたは1つしか設定されていない場合、テストはfalseになります。
これは、そのプロパティを決定するための最も効率的な方法です。
まず、このコードは有効なPHPであるため、タイトルが貧弱です。
次に、進行中の2進演算は次のようになります。
42 = 101010
&
41 = 101001
-----------
40 = 101000
グレッグが述べているように、これは2の累乗をチェックする最も速い方法ですが、指定したコードは、数値が2の累乗ではないかどうかをチェックします。これは、PHPのポリシーで簡単に確認できます。null以外/ゼロ以外の値はすべてtrueです。