ビット演算で偶数判定
ビット演算で偶数判定 とは
& 1を使って数値の最下位ビットだけを見て偶数/奇数を判定する超高速テクニックを学ぼう。本レッスンでは、ビット演算で偶数判定 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
剰余 % 2 で偶数を見抜く (発展で & 1)
プログラミングでとても多い判定が「この数は偶数か? 奇数か?」というものです。もっとも素直な書き方 は n % 2 === 0 という剰余演算で判定する方法です。チームで読みやすく、初学者にも伝わりやすいので、まずこの形を完璧に書けるようにします。
このレッスンでは、最初に % 2 で偶数判定を実装し、最後に発展知識として & 1 を使ったビット演算版にも触れます。実務では % 2 を使うのが基本です。
ポイント 偶数判定の 第一候補は
n % 2 === 0。ビット演算は知識として知っておく、という温度感で十分です。
% (剰余) 演算子のおさらい
% は「a を b で割った余り」を返す演算子です。n を 2 で割った余りが 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 % 2は0、-3 % 2は-1になるので、=== 0で偶数判定が成立します。
Mermaid で流れを追う
判定ロジックを図にすると、たったこれだけです。
「% で余りを取って、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 つができることを確認しましょう。
- ビット演算 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. ビット演算 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 関数名は
isEven、引数はnの 1 つにすること - 基本解として
n % 2 === 0の形で実装すること 0や負の整数も正しく判定できること
入出力例
test-cases.txt
isEven(4) → true
isEven(5) → false
isEven(0) → true
isEven(1) → false
isEven(-2) → true
isEven(-3) → false