2009-10-11 9 views
5

このコードは何を意味し、ビットシフトを使用せずに同じことを達成する他の方法は何ですか?

if ($n & ($n - 1)) 
+2

これは実際にビット単位であり、ビットシフトではありません。 –

+1

宿題?インタビュー? :) – DVK

+0

なぜビット単位の操作を避ける必要がありますか? – MAK

答えて

17

checks to see whether a number is a power of 2(書かれたとして、あなたの条件が真の場合、その数は2のパワーではない)こと。

別の言い方をすれば、テストでは、バイナリ表現$nに複数の「1」ビットが設定されているかどうかを確認します。ゼロまたは唯一のビットが設定されている場合、テストは偽になります。

このプロパティを確認するのが最も効率的な方法です。

+1

グレッグ、質問は本質的に、数字が2の累乗でないかどうかを調べるテストです。 '== 0'を指定しないと、PHPはゼロ以外の値をtrueにします。 –

+0

はい、私は論理否定が明らかだと思いました。それにもかかわらず、私はそれを明示するために私の答えを修正しました。 –

+0

まあ、一見するとネガティブではありません(それは '!= 0'です)、私のアイズの印象は彼が初心者レベルだということです。 –

5

まず、このコードは有効なPHPであるため、タイトルが貧弱です。

第二には、起こってバイナリ算術は、このようなものになります:グレッグ状態と同様

42 = 101010 
    & 
41 = 101001 
----------- 
40 = 101000 

をこれは、2数の電源をチェックする最速の方法が、あなたが見るためにチェックを与えてくれたコードです数字がでない場合は2の累乗ではない。これは、PHPのポリシーによって容易に確認できます。非null/non-zero値がtrueの場合

関連する問題