XOR の「同じなら 0、違えば 1」という性質を使い、マスクの 1 の位置だけを反転 する操作。0 の桁は元のまま保持されます。
ビット反転とは、ビットの値を「0 ↔ 1」とひっくり返すことです。日常で例えると、電気のスイッチを切り替える動作に近いイメージで、ON は OFF に、OFF は ON になります。
単純に「全部反転」したいだけなら NOT 演算で済みますが、特定の桁だけを選んで反転したい場合があります。そんなときに使うのが「XOR + マスク」の組み合わせです。マスクの 1 の位置だけ反転、0 の位置はそのまま。上のツールで mask を動かすと、反転される桁(オレンジ)と保持される桁の対比が見えます。
XOR は「2 つの入力が違えば 1、同じなら 0」になる演算です。これを 1 桁ずつ当てはめると、反転になるかどうかが綺麗に分かれます。
・マスクが 1 の桁:0 XOR 1 = 1、1 XOR 1 = 0。必ず反転する
・マスクが 0 の桁:x XOR 0 = x。元の値がそのまま残る
AND(0 にする)や OR(1 にする)と違って、XOR は元の値に依存して結果が変わるのが特徴です。具体例:
value: 1011 0011 (= 179)
mask: 0000 1111 (= 15) ← 下位 4 ビットを反転したい
─────────────────────────
XOR => 1011 1100 (= 188) ← 下位 4 ビットだけ反転
さらに重要な性質として、同じマスクで 2 回 XOR すると元に戻るという可逆性があります。(value ^ mask) ^ mask = value。これが暗号やトグル処理で XOR が好まれる理由です。
ビット反転は、実務でいろいろな場面で活躍します。
・フラグの ON/OFF トグル(切替):「クリックされたら状態を反転させる」UI ロジックで、AND と OR を組み合わせる代わりに 1 回の XOR で完結する
・1 の補数を作る:マスクを全 1(0xFF など)にして XOR すると、全ビット反転 = 1 の補数になる
・簡易暗号:データと鍵を XOR すると暗号化、同じ鍵でもう一度 XOR すると復号できる(XOR の可逆性)。ストリーム暗号の基本原理
・パリティ計算:ビット列全体を XOR すると、1 が奇数個か偶数個かが分かる。エラー検出に使われる
・変数の値交換(XOR swap):a^=b; b^=a; a^=b; で a と b の値を中間変数なしに入れ替えられる(古典的なテクニック)
XOR の動きは「マスクの 1 の位置だけ反転する」という 1 つの原則に集約されます。これを押さえれば、ビット列とマスクの XOR や全ビット反転の結果も同じ考え方で求められます。