2

重複の可能性:
参照 - この記号は PHP で何を意味しますか?

私は次の関数に出くわしたいくつかのレガシーコードに取り組んでいます:

function is_odd($number) {
   return $number & 1; // 0 = even, 1 = odd
}

数字がそのように書かれているかどうかを確認する方法を見たことがなく、実際に何をしているのかを理解しようとしています。

4

1 に答える 1

7

&ビットごとの andであり、基本的には1、両方のオペランドにあるすべてのビットに対して1、結果の値と0他のすべてのビットを生成するように機能します。数値をビット表現に変換すると、数値が偶数か奇数かを決定するのは最下位ビットであることがすぐにわかります。次に例を示します。

   5 = 101
  10 = 1010
  13 = 1101
1030 = 10000000110

最下位ビット (一番右にあるもので、最下位ビットとも呼ばれます) は、奇数ごとに 1 で、偶数ごとに 0 です。実行$n & 1すると、常に0最下位ビット以外のすべてのビットが生成されます (数値 1 には 1 ビットしかないため、残りのビットは、他のオペランドの長さに一致するように左に 0 が埋め込まれていると想像できます)。したがって、基本的に操作はオペランドの最下位ビットを比較することに要約され、1 & 11 であり、他のすべての組み合わせは 0 です。したがって、基本的に$n & 11 が得られた場合、それは数が奇数であることを意味し、それ以外の場合は偶数です。

編集。

先ほど示した値の例に対してビット単位の 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 になることが簡単にわかります。

于 2013-02-01T13:59:17.630 に答える