ビット演算とは — AND/OR/XOR/NOT/SHIFTの基礎と活用
ビット演算はコンピューターが2進数レベルで行う演算で、フラグ管理・マスク処理・ハッシュ計算など低レイヤーな処理で多用されます。AND/OR/XOR/NOT/SHIFTの意味と使い所を理解することで、より効率的なコードが書けます。
AND(&)とOR(|)の違い
AND演算は両方のビットが1のときだけ1になります。特定のビットを取り出す「マスク処理」に使います(例: n & 0xFF で下位8ビットを取得、n & 1 で奇数判定)。OR演算はどちらかが1なら1になり、フラグを立てる操作に使います(例: flags | OPTION_FLAG)。実際のユースケースとして、ユーザーの権限フラグを整数1つで管理する設計があります。READ=1, WRITE=2, EXECUTE=4のように2のべき乗でフラグを定義し、ORで組み合わせ・ANDで検査できます。LinuxのchmodやUnixパーミッション(rwxrwxrwx)はこの仕組みの代表例です。
XOR(^)の特徴と活用
XORは2つのビットが異なるとき1になります。同じ値でXORすると0に戻る性質(a ^ b ^ b = a)があり、スワップ・暗号化・チェックサム・差分検出に活用されます。また2つの値が等しいかを判定するのにも使えます。XORの対称性を使った古典的なスワップアルゴリズムは追加変数なしで実現できます(a ^= b; b ^= a; a ^= b;)。暗号学では共通鍵暗号の基本演算として使われ、チェックサムやCRC計算にも登場します。ゲームプログラミングでは2つのインデックスが一致するか判定する最速手段としても使われます。
NOT(~)とビットシフト
NOT演算は全ビットを反転します。32ビット整数で ~0 = -1(すべてのビットが1)になります。LEFT SHIFT(<<)は指定ビット数だけ左にずらし、2のべき乗の掛け算と等価です(n << 3 は n × 8)。RIGHT SHIFT(>>)は右にずらし、2のべき乗の割り算になります(n >> 2 は n ÷ 4)。シフト演算は整数の乗除算を乗算命令より高速に実行できる最適化手法です。ただし現代のコンパイラは自動でシフト最適化を行うため、可読性を優先してn * 8と書いても問題ない場合がほとんどです。
ビット演算の実用例
パーミッションフラグ管理(UNIX chmod)、ネットワークのサブネットマスク計算(IPアドレス & サブネットマスク)、ゲームの衝突検出最適化(ビットマスクで対象レイヤーを絞る)、ハッシュ関数の実装、カラー値のRGB分離(color >> 16 & 0xFF でRed成分取得、color >> 8 & 0xFF でGreen)など、実用的な場面が多くあります。JavaScriptのNumber.parseInt()で16進カラーコードをパースした後にビット演算でR・G・Bを分離するパターンは、カラーツール実装の定番コードです。Bitwise Calculatorでは各演算の結果を2進数・16進数で同時確認できます。