HOWTO · Java
Java の XOR 演算子
Java の ^ 演算子を Boolean と整数の XOR に使う方法を、検証済みの例と注意点で説明します。
このページの内容
^ は Java の XOR(排他的論理和)演算子です。boolean では条件がちょうど一つだけ真になる場合に、整数ではビット単位 XOR に使用します。べき乗演算子ではありません。Java に ** 演算子はありません。Java Language Specification は両方の ^ を定義しています。
条件には Boolean 形式、ビットやマスクには整数形式を選びます。例は OpenJDK 17.0.20.1 で実行し、準備では現行の JDK 26 リリース情報を確認しました。
Boolean 値で XOR を使う
二つの Boolean オペランドでは、XOR は値が異なるときだけ true です。真理値表は次のとおりです。
| 左 | 右 | left ^ right |
|---|---|---|
false |
false |
false |
false |
true |
true |
true |
false |
true |
true |
true |
false |
&& や || と違い、^ は両方のオペランドを評価します。value != null && value.isReady() のような短絡評価のガードの代わりには使わないでください。メソッド呼び出しも評価されます。両方を安全に評価でき、「ちょうど一つ」が規則のときに使います。
この検証済みの例は Boolean XOR と整数 XOR を同時に示します。
public class BooleanAndIntegerXor {
public static void main(String[] args) {
System.out.println(true ^ false);
System.out.println(true ^ true);
System.out.println(0b1100 ^ 0b1010);
}
}
出力:
true
false
6
最初の二行は Boolean の規則です。整数では 0b1100 ^ 0b1010 は 0b0110、すなわち十進数の 6 になります。入力ビットが異なる位置だけ結果ビットが 1 です。
整数値とマスクで XOR を使う
ビット形式は byte、short、char、int、long などの整数プリミティブを受け取ります。Java は演算前に二項数値昇格を行うため、小さい整数型を含む式は通常 int になります。float と double は XOR のオペランドにできません。キャストは本当に必要な場合だけにしてください。ビットが失われることがあります。
XOR は選択したビットの反転に役立ちます。flags が整数で mask が変更するビットを示すなら、flags ^ mask はそのビットだけを反転します。同じマスクをもう一度適用すると、x ^ y ^ y は x なので元のビットに戻ります。この可逆性は制御されたビット操作に有用ですが、明快なアプリケーションロジックの代わりにはなりません。
対になる値がない一つの値を見つける
整数 XOR の簡潔な用途は、他のすべての値がちょうど二回現れるときに一つの値を見つけることです。x ^ x は 0、0 ^ x は x なので、同じ値は打ち消されます。
public class UniqueNumberXor {
public static void main(String[] args) {
int unique = 0;
for (int value : new int[] {4, 9, 4}) {
unique ^= value;
}
System.out.println(unique);
}
}
出力:
9
これは境界条件に敏感な手法であり、一般的な「一意の数を探す」アルゴリズムではありません。ペアにならない値が一つで、他のすべてがちょうど二回現れる場合だけに機能します。別の値が三回現れる場合は一意の値を特定できません。出現規則が異なる、または頻度も必要な場合はカウント方式を選んでください。
適切な場合は明快な代替手段を優先する
二つの Boolean 値の不等比較には != を使うと、^ より意図が直接伝わることがあります。整数が奇数か偶数かの判定には & 1 を使います。偶奇は XOR ではなく AND の演算です。XOR による変数交換は有名な技巧ですが、一時変数や通常の代入の方が Java では明快で、エイリアスの間違いも防げます。
重要な区別は単純です。^ は boolean 値では排他的論理和、整数ではビット単位 XOR を表します。オペランドの型を確認し、Boolean の両側が評価されることを覚え、重複の打ち消しに頼る前にデータの前提を明示してください。