9

別の開発者によって書かれたいくつかのコードを見て、私はこれに出くわしました:

for($i=1; $i<=30; $i++)
{
  if($i&1)
    $color = '#fff';
  else
    $color = '#bbb';
}

この$color変数は、コードの後半で行の背景色に使用されます。交互の色はうまく機能します。

これを書いているとしたら、ビット単位(&)演算子ではなく、モジュラス演算子(%)を使用していました。

この場合、なぜビット演算子が機能するのですか?剰余演算子ではなく、この方法を使用する利点はありますか?

4

2 に答える 2

9

&演算子は、数値をビット単位で比較します。だからあなたがするなら

$i & 1

次に、バイナリのように「1」フラグが設定されているかどうかを通知します。

001010111010

最後の番号は「1」フラグです(バイナリは逆の順序で1、2、4、8などになることを忘れないでください)。この場合は0に設定されます。

1はバイナリの唯一の奇数フラグであるため、数値が奇数か偶数かを示します。

たとえば、$ iが3の場合、バイナリでは011になります。最後の数値は1(1フラグ)であるため$i & 1、trueになります。

たとえば、$ iが4の場合、バイナリでは100になります。最後の数値は0(1フラグ)であるため$i & 1、falseになります。

于 2012-07-16T10:17:57.490 に答える
4

数が奇数の場合は最初のビットが常に1であり、数が偶数の場合は0であるため、これは機能します。

  1
 10
 11
100
101
110
111
etc.

理論的には、ビット単位の演算はモジュラス演算よりも高速ですが、インタプリタがモジュラス演算をビット単位の演算に最適化した可能性があります。

他の開発者がなぜそれを使用したのか、私たちは推測することしかできません:習慣から、どこかからコピーペーストされ、モジュラス演算子について知らず、誇示し、最適化したいと思っています...

于 2012-07-16T10:22:19.287 に答える