C言語でプログラミングを行っていると、ビット単位での操作が必要になる場面があります。その中でも特にユニークで応用範囲が広いのが、「排他的論理和(XOR)」です。
「一時変数を使わずに値を入れ替えたい」
「簡易的な暗号化処理を実装したい」
こうした高度な処理も、排他的論理和の性質を利用すれば驚くほどシンプルなコードで実現できます。
しかし、演算子の記号が ^ であるため、他の言語(累乗など)と混同しやすく、優先順位の罠にハマりやすいという側面もあります。
この記事では、C言語における排他的論理和の基本的な仕組みから、演算子 ^ の使い方、そして現在の開発現場でも役立つ実践的なテクニックまでを、サンプルコード付きで詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
排他的論理和(XOR)とは?基本の仕組み
排他的論理和(eXclusive OR)は、2つのビット(0または1)を比較し、「値が異なるときだけ 1(真)」 になり、「値が同じときは 0(偽)」 になる論理演算です。
日本語では「排他的」という言葉が少し難しく感じられますが、「どちらか片方だけが1のときに1になる」と覚えると分かりやすいでしょう。
XORの真理値表
ビットごとの計算ルール(真理値表)は以下のようになります。
| 入力A | 入力B | 結果 (A ^ B) | 解説 |
|---|---|---|---|
| 0 | 0 | 0 | 同じなので0 |
| 0 | 1 | 1 | 違うので1 |
| 1 | 0 | 1 | 違うので1 |
| 1 | 1 | 0 | 同じなので0 |
この「同じなら0、違えば1」という性質が、後述するビット反転や暗号化において非常に重要な役割を果たします。
C言語での排他的論理和の書き方
C言語で排他的論理和を行うには、^(ハット)演算子 を使用します。
数学や一部の言語では ^ を「累乗(べき乗)」の意味で使うことがありますが、C言語では全く異なる意味になるので注意が必要です。
整数同士のXORを計算するコード
#include <stdio.h>
int main(void) {
// 2進数で表記(C23規格やGCC拡張など)
// 10進数では a=10, b=12
unsigned int a = 0b1010;
unsigned int b = 0b1100;
// 排他的論理和を計算
unsigned int result = a ^ b;
printf("a = 0b1010 (%d)\n", a);
printf("b = 0b1100 (%d)\n", b);
printf("result = 0b0%b (%d)\n", result, result); // %bはC23以降の2進数表示
return 0;
}
実行結果
a = 0b1010 (10)
b = 0b1100 (12)
result = 0b0110 (6)
上記のプログラムでは、1010 と 1100 の各ビットに対してXOR演算を行っています。
先頭のビットから順に見ると、1ビット目は「1と1で同じなので0」、2ビット目は「0と1で違うので1」、3ビット目は「1と0で違うので1」、4ビット目は「0と0で同じなので0」となります。
結果として 0110(10進数で6)が得られます。
このように、^ 演算子を使うだけで、ビット単位の比較と計算が一瞬で行われます。
実務で役立つ!XORの便利な活用テクニック
XORは単なる計算だけでなく、その特性を活かした「アルゴリズム的な使い道」が数多く存在します。
ここでは、C言語のプログラミングで頻出する3つのテクニックを紹介します。
1. 特定のビットを反転(トグル)させる
ある変数の特定のビットだけを「0なら1に、1なら0に」反転させたい場合、XORが最適です。
反転させたいビットの位置に「1」を立てたマスクデータを用意し、それと対象データとのXORをとることで実現できます。
#include <stdio.h>
int main(void) {
unsigned int flags = 0b1111; // 元の値(全て1)
unsigned int mask = 0b0100; // 下から3番目のビットを反転させたい
// XORで反転処理
flags = flags ^ mask;
printf("反転後: 0b%b\n", flags);
// もう一度実行すると元に戻る(トグル動作)
flags = flags ^ mask;
printf("再反転: 0b%b\n", flags);
return 0;
}
実行結果
反転後: 0b1011
再反転: 0b1111
mask のビットが 1 の部分は、元の値が 0 なら 1 に、1 なら 0 に反転します(違う値になるため)。
一方、mask が 0 の部分は、元の値が変わらずそのまま維持されます。
これを利用して、ゲームのスイッチや設定のON/OFFを切り替える「トグル機能」を簡単に実装できます。
2. 一時変数を使わずに値を入れ替える(Swap)
通常、2つの変数の値を入れ替えるには一時的な変数(tempなど)が必要ですが、XORを使うと変数だけで入れ替えが可能です。
これはメモリを節約したい組み込み開発などで好まれる古典的なテクニックです。
#include <stdio.h>
int main(void) {
int x = 10;
int y = 20;
printf("交換前: x=%d, y=%d\n", x, y);
// XOR交換アルゴリズム
x = x ^ y;
y = x ^ y;
x = x ^ y;
printf("交換後: x=%d, y=%d\n", x, y);
return 0;
}
実行結果
交換前: x=10, y=20
交換後: x=20, y=10
一見すると何が起きているか分かりにくいですが、3回のXOR演算を行うことで、魔法のように値が入れ替わります。
数学的には (A ^ B) ^ B = A (同じ値を2回XORすると元に戻る)という性質を利用しています。
現代のコンパイラは最適化が優秀なので、可読性のために temp 変数を使うのが一般的ですが、XORの面白さを知る良い例です。
3. 簡易的な暗号化と復号
「同じ値を2回XORすると元に戻る」という性質は、暗号化にも応用できます。
あるデータを「鍵」となるデータとXORすれば暗号化され、できた暗号文にもう一度「鍵」とXORすれば元のデータに戻ります。
#include <stdio.h>
int main(void) {
char data = 'A'; // 元のデータ
char key = 0x55; // 秘密鍵
// 暗号化
char encrypted = data ^ key;
printf("暗号化データ: %X\n", encrypted);
// 復号(もう一度同じキーでXOR)
char decrypted = encrypted ^ key;
printf("復号データ: %c\n", decrypted);
return 0;
}
実行結果
暗号化データ: 14
復号データ: A
文字 'A' に鍵 0x55 を掛けて暗号化し、全く別の値に変えています。
しかし、その値に対して再度 0x55 を掛けると、元の 'A' が復元されました。
通信データの簡易的な目隠し(スクランブル)などで使われる手法です。
間違いやすいポイントと注意点
排他的論理和を使う上で、特に初心者が陥りやすいミスがあります。
演算子の優先順位に注意
ビット演算子 ^ は、比較演算子 == や != よりも優先順位が低いです。
そのため、計算結果をすぐに判定したい場合は、必ずカッコで囲む必要があります。
// 誤った例(意図:resultが0かどうか判定)
// result ^ mask == 0
// → これは result ^ (mask == 0) と解釈されてしまう
// 正しい例
if ((result ^ mask) == 0) {
// 処理
}
「べき乗」ではない
冒頭でも触れましたが、2^3 と書いても「2の3乗(8)」にはなりません。
「2と3のXOR(1)」になります。
累乗計算をしたい場合は pow 関数を使うか、2の累乗であればシフト演算 << を使いましょう。
C言語のスキルを活かして年収を上げる方法
以上、C言語での排他的論理和の使い方について解説してきました。
C言語を扱えるエンジニアは比較的希少価値が高く、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



