5

偶数と奇数を見つけるために、私は常に次を使用してきました。

if(   $num % 2  ) { echo "odd"; }
if( !($num % 2) ) { echo "even"; }

しかし最近、まったく同じように機能する次のコードに出くわしました。

if(   $num & 1  ) { echo "odd"; }
if( !($num & 1) ) { echo "even; }

2 番目のメソッドの「&」の背後にあるロジックは何ですか?

PHP: Arithmetic Operatorsを確認しましたが、アンパサンドはオプションの一部ではありません。

ありがとう。

4

2 に答える 2

12

これはビットごとの AND演算子です。コンピューターでは、すべての整数が 2 進数形式で格納され、最下位の 2 進数が 2^0 == 1 であることを思い出してください。したがって、すべての奇数は最下位の 2 進数 = 1 になります。

したがって、ビットごとの AND 演算子は、値をビットごとに定数と比較します11両方のオペランドにあるビットは結果で に設定されますが、いずれかのオペランドにあるビットは結果で に設定さ1れます。最終結果 ( または のいずれか) は、ステートメントの句として使用しているため、PHP によってブール値に強制されます。0010if()

&の代わりに均一性をチェックする非常に正当な理由があります%: Speed! 演算子は%除算演算を必要とするため、剰余を計算できます。これは、ビットを直接比較するよりも計算コストがはるかに高くなります。

例:

$num = 9;                // 9 == 8 + 1 == 2^3 + 2^0 == 1001b
echo (string)($num & 1); // 1001b & 0001b = 0001b - prints '1'

$num = 10;               // 10 == 8 + 2 == 2^3 + 2^1 == 1010b
echo (string)($num & 1); // 1010b & 0001b = 0000b - prints '0'
于 2013-06-18T18:13:36.530 に答える
8

&はバイナリANDです。

奇数 AND 1 のバイナリ値は 1 になり、偶数 AND 1 のバイナリ値は 0 になります。

これは、奇数のバイナリ値が常に 1 で終わり、偶数のバイナリ値が 0 で終わるために発生します。

10101101 & 00000001 = 00000001奇数の場合と、

10101100 & 00000000 = 00000000偶数の場合。

于 2013-06-18T18:20:31.563 に答える