ビット演算で偶数判定

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

ビット演算で偶数判定 とは

& 1 を使って数値の最下位ビットだけを見て偶数/奇数を判定する超高速テクニックを学ぼう。本レッスンでは、ビット演算で偶数判定 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

剰余 % 2 で偶数を見抜く (発展で & 1)

プログラミングでとても多い判定が「この数は偶数か? 奇数か?」というものです。もっとも素直な書き方n % 2 === 0 という剰余演算で判定する方法です。チームで読みやすく、初学者にも伝わりやすいので、まずこの形を完璧に書けるようにします。

このレッスンでは、最初に % 2 で偶数判定を実装し、最後に発展知識として & 1 を使ったビット演算版にも触れます。実務では % 2 を使うのが基本です。

ポイント 偶数判定の 第一候補は n % 2 === 0。ビット演算は知識として知っておく、という温度感で十分です。

% (剰余) 演算子のおさらい

% は「ab で割った余り」を返す演算子です。n2 で割った余りが 0 なら偶数、1 なら奇数になります。

JavaScript

console.log(0 % 2); // 0 console.log(1 % 2); // 1 console.log(2 % 2); // 0 console.log(3 % 2); // 1 console.log(4 % 2); // 0 console.log(5 % 2); // 1

偶数判定の関数はこれだけで完成します。

JavaScript

function isEven(n) { return n % 2 === 0; } console.log(isEven(4)); // true console.log(isEven(5)); // false console.log(isEven(0)); // true console.log(isEven(-2)); // true 負の偶数も OK

注意 n % 2 === 0負の数でも正しく動きます-2 % 20-3 % 2-1 になるので、=== 0 で偶数判定が成立します。

Mermaid で流れを追う

判定ロジックを図にすると、たったこれだけです。

diagram (will load when visible)

% で余りを取って、0 か見るだけ」というシンプルさが % 2 の強みです。コードを読む人が一瞬で意図を理解できます。

よくある間違い

% を使うときに気をつけたい点を 3 つ。

  • = 0=== 0 の取り違え — 比較は === を使います。= は代入になってしまいます
  • 小数を渡したときisEven(3.7) は意図しない結果になります。整数だけを渡す前提で書くのが安全です
  • 大量に呼ぶ場面の心配は不要 — 現代のエンジンは % 2 を十分高速に最適化します。& 1 に書き換える価値はほぼありません

そのほか、現場で「式に ! を付けて反転」させた書き方もよく登場します。「偶数なら true」を逆にして「奇数なら true」にしたいときは return n % 2 !== 0; と書くのが分かりやすいです。!(n % 2 === 0) のように二重に書くと読みづらいので避けます。

注意 「ビット演算は速いから使うべき」というのは古い感覚です。現代の JavaScript では計測しても差はほぼ出ないので、読みやすさ優先で % 2 を選ぶ のが現代の常識です。

発展 ビット演算 & 1

ここからは 発展枠 です。剰余の代わりに、最下位ビットだけを取り出す & 1 でも偶数判定ができます。& 1 は数値を 2 進数として見たときの一番右の桁だけを残す演算です。

JavaScript

// 0 → 0b000 (偶数) // 1 → 0b001 (奇数) // 2 → 0b010 (偶数) // 3 → 0b011 (奇数) // 4 → 0b100 (偶数) // 5 → 0b101 (奇数)

最下位ビットが 0 なら偶数、1 なら奇数です。コードはこうなります。

JavaScript

function isEvenBit(n) { return (n & 1) === 0; }

% 2 とまったく同じ結果になります。ライブラリ内部の最適化コードや、低レベル系のコードで & 1 に出会ったら「あ、偶数判定だな」と読み取れれば十分です。普段のコードでは % 2 を使いましょう。

ヒント & (1 個) はビット演算、&& (2 個) は論理 AND です。if (a & b) と書くと整数のビット AND を真偽値として評価してしまうので、混同しないように注意します。

なお JavaScript のビット演算には & 以外に | (OR)、^ (XOR)、~ (NOT)、<< / >> (シフト) があります。フラグ管理や RGB カラーの分解などで使う場面はありますが、入門段階では「& 1 で最下位ビットを取り出す」という典型例だけ知っておけば十分です。

やってみよう

それでは課題に取り組みましょう。isEven(n)% 2 を使って実装してください。

書き方の方針は次のとおりです。

  • return n % 2 === 0; の 1 行で完成
  • テストには 0 と負の数も含まれます。0 は偶数、-2 も偶数として扱うこと
  • 慣れてきたら (n & 1) === 0 のビット演算版にも挑戦して、どちらでも同じ結果になることを確認してみましょう

よくある質問

Q. ビット演算は実務でいつ使いますか?

A. フラグ管理(permission の rwx)、画像処理(マスク)、ハッシュ計算の高速化などで使います。複数の真偽値を 1 つの整数にまとめると、メモリ削減と演算高速化の両方が得られます。例えば 8 個の権限を 1 byte で表せます。

Q. AND / OR / XOR の代表的な使い道は?

A. AND は「特定ビットの確認・抽出」(flags & PERM_READ)、OR は「ビットの立て上げ」(flags |= PERM_WRITE)、XOR は「ビット反転や暗号化」で使います。XOR は 2 回かけると元に戻る性質から、簡易暗号や両端ポインタの入れ替えなどに応用できます。

Q. シフト演算で割り算しても良いですか?

A. 正の整数の 2 のべき乗での除算なら x >> n と x / (1<<n) は同じ結果になります。ただし負の数では言語ごとに挙動が違う(算術シフトと論理シフトの区別)ため、可読性と安全性のために通常の演算子を使い、性能ボトルネックでのみシフトを検討してください。

次のレッスン

次は 演算子の優先順位 で、& 1 を使って数値の最下位ビットだけを見て偶数/奇数を判定する超高速テクニックを学ぼう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ビット演算 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ビット演算 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 関数名は isEven、引数は n の 1 つにすること
  2. 基本解として n % 2 === 0 の形で実装すること
  3. 0 や負の整数も正しく判定できること

入出力例

test-cases.txt

isEven(4)true isEven(5)false isEven(0)true isEven(1)false isEven(-2)true isEven(-3)false

ヒント

main.js
main.js
学習モード

メモ

ビット演算で偶数判定

⌘S で保存