($var & 1)
私はコードでよく使用します。これ$var
は、が奇数の場合はtrueを返し、偶数の場合はfalseを返します。
しかし、「&」は実際に何をするのでしょうか。
($var & 1)
私はコードでよく使用します。これ$var
は、が奇数の場合はtrueを返し、偶数の場合はfalseを返します。
しかし、「&」は実際に何をするのでしょうか。
&はバイナリand
です。バイナリ値があり、and
別のバイナリ値がある場合、結果は2つのビット単位and
になります。例:
01101010
& 01011001
= 01001000
右端のビットは1(この場合は奇数)または0(この場合は偶数)のいずれかです。1の数値の場合&
、最下位ビットのみを調べ、ifは、数値が1か0かをチェックします。他の人が述べているように、ビット単位の演算子を調べて、それらがどのように機能するかを確認してください。
バイナリ システムの基本となる 2 つの演算は、OR と AND です。
OR は、「A がオンか B がオンの場合」を意味します。実際の例では、2 つのスイッチが並列に接続されています。どちらかが電流を通過させている場合、電流は通過します。
AND は「A と B の両方がオンの場合」を意味します。実世界の例は、直列の 2 つのスイッチです。電流は、両方が電流を通過できる場合にのみ通過します。
コンピューターでは、これらは物理的なスイッチではなく半導体であり、その機能は論理ゲートと呼ばれます。それらはスイッチと同じ種類のことを行います-電流に反応するか、電流なしに反応します。
整数に適用すると、一方の数値のすべてのビットが他方の数値のすべてのビットと結合されます。したがって、ビット単位の演算子 OR と AND を理解するには、数値を 2 進数に変換してから、一致するビットのすべてのペアに対して OR または AND 演算を実行する必要があります。
それが理由です:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
一方
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
したがって、(& 1) 演算は、AND ロジックを使用して右端のビットを 1 と比較します。他のすべてのビットは事実上無視されます。2 進数の偶数は、10 進数の偶数でもあります (10 は 2 の倍数です)。
バイナリ システムに対するその他の基本的な操作には、NOT と XOR があります。NOT は「A がオフの場合」を意味し、2 つではなく 1 つの信号または「パラメーター」のみを取る論理ゲートの唯一の形式です。XOR は、「A または B のいずれかがオンで、両方がオンでない場合」を意味します。そして、NAND、NOR、および NXOR がありますが、これらは基本的に AND、OR、および XOR とは結合されません。つまり、NAND は「A と B の両方がオンでない場合」を意味します。
プログラミングでは、オペレータ
& means AND,
| means OR,
~ means NOT, and
^ means XOR.
他のものは、これらを組み合わせることで構成できます。たとえば、次のようになります。
~ (a & b) is equivalent to a NAND operation
PHP特有の注意
ビット単位の演算子は浮動小数点値では機能せず、PHP では最初に float 値が暗黙的に整数に変換されます。整数として表現できる範囲外の数値はゼロに切り捨てられます。つまり、PHP_INT_MAX を超えるすべての数値は式で「偶数」に見えます($num & 1)
)。PHP_INT_MIN/PHP_INT_MAX 以外の数値をサポートする場合は、fmod($num, 2)
. ただし、64 ビットの PHP を使用している場合は、いずれにしても整数の方が浮動小数点数よりも精度が高くなります。
これは、ビット単位とPHPについて知ることも興味深いです。
/**
* Regular
*/
echo (true && true); // 1
echo (true && false); // nothing
echo (true || false); // 1
echo (false || false); // nothing
echo (true xor false); // 1
echo (false xor false); // nothing
/**
* Bitwise
*/
echo (true & true); // 1
echo (true & false); // 0
echo (true | false); // 1
echo (false | false); // 0
echo (true ^ false); // 1
echo (false ^ false); // 0
あなたの質問はビットごとの演算子を理解することに関するものであり、受け入れられた答えはそれをよく説明しています。しかし、あなたが与える例については、代わりにモジュロ演算子を使用することをお勧めします。
($var % 2) /* instead of */ ($var & 1)
数が奇数 (2 で割り切れない) であることを確認しているという意図が明確になり、より一般的であるため、 ($var % 3) を同じ方法で使用して、任意の N に対してどのように機能するかを推測できます。