重複の可能性:
参照 - この記号は PHP で何を意味しますか?
私は次の関数に出くわしたいくつかのレガシーコードに取り組んでいます:
function is_odd($number) {
return $number & 1; // 0 = even, 1 = odd
}
数字がそのように書かれているかどうかを確認する方法を見たことがなく、実際に何をしているのかを理解しようとしています。
重複の可能性:
参照 - この記号は PHP で何を意味しますか?
私は次の関数に出くわしたいくつかのレガシーコードに取り組んでいます:
function is_odd($number) {
return $number & 1; // 0 = even, 1 = odd
}
数字がそのように書かれているかどうかを確認する方法を見たことがなく、実際に何をしているのかを理解しようとしています。
&
はビットごとの andであり、基本的には1
、両方のオペランドにあるすべてのビットに対して1
、結果の値と0
他のすべてのビットを生成するように機能します。数値をビット表現に変換すると、数値が偶数か奇数かを決定するのは最下位ビットであることがすぐにわかります。次に例を示します。
5 = 101
10 = 1010
13 = 1101
1030 = 10000000110
最下位ビット (一番右にあるもので、最下位ビットとも呼ばれます) は、奇数ごとに 1 で、偶数ごとに 0 です。実行$n & 1
すると、常に0
最下位ビット以外のすべてのビットが生成されます (数値 1 には 1 ビットしかないため、残りのビットは、他のオペランドの長さに一致するように左に 0 が埋め込まれていると想像できます)。したがって、基本的に操作はオペランドの最下位ビットを比較することに要約され、1 & 1
1 であり、他のすべての組み合わせは 0 です。したがって、基本的に$n & 1
1 が得られた場合、それは数が奇数であることを意味し、それ以外の場合は偶数です。
編集。
先ほど示した値の例に対してビット単位の and がどのように機能するかを示すいくつかの例を次に示します。括弧内の数値は元の 10 進数です。
101 (5)
& 001 (1)
---
001 (1) = true
1010 (10)
& 0001 (1)
----
0000 (0) = false
1101 (13)
& 0001 (1)
----
0001 (1) = true
10000000110 (1030)
& 00000000001 (1)
-----------
00000000000 (0) = false
このことから、両方のオペランドの右端のビットが 1 の場合にのみ、結果が true になることが簡単にわかります。