イナズマの日記

こんにちは。

論理演算を用いた奇数と偶数の判定

一般に奇遇の判定は

int a = 10; // aは任意の整数
if (a % 2 == 1)
  // 処理
else
  // 処理

みたいなことをするが、AND演算でできることを知ったのでメモ。

上のようなソースコード

int a = 10;
if(a & 1)
  // 処理
else
  // 処理

と書き換えられる。

上記のコードにおいて、なにが行われているか簡単に説明する。

はじめに、任意の整数をnと置き、1とnを二進の値に置き換える。
1を二進数に直すと0b0000…1。つまり最下位Bitが1で、最下位Bit以外はすべて0であることがわかる。 また、任意の奇数を二進数に直すと、最下位Bitが1でその他のBitは整数によって変化することがわかる。1

次に、この2つの値の論理積を求める。
まず、最下位Bitから考える。 aの最下位Bitは、aが奇数である場合必ず1になるので、最下位Bitの論理積は1になり、偶数の場合は0になる。 次にその他のBitを考える。 1の最下位Bit以外が全て0であることから、nがいかなる値であろうと最下位Bit以外の部分での論理積は0になる。

このことから、1とnの論理積は、nの最下位Bitによって決定することがわかる。

1をboolean型にキャストするとtrue、0をキャストするとfalseになることから、上記のコードで奇数偶数判定になることがわかる。

にしても、蟻本やチーター本を読んでると、解説以外のとこにもこういう豆知識みたいなのがちょくちょく混ざってるから楽しいね🤘


  1. 少し考えればわかることだが、最下位Bitは2^0を表し、その他の部分は2^nを表している。前者は奇数を表せるが、後者は必ず偶数になることから、奇数の場合最下位Bitは1、偶数の場合は最下位Bitは0となる。