HOWTO · Java

O operador XOR em Java

Use o operador ^ do Java para XOR booleano e inteiro, com exemplos testados e armadilhas comuns.

Nesta página

Em Java, ^ é o operador XOR (OU exclusivo). Use-o com valores boolean quando exatamente uma condição deve ser verdadeira, ou com inteiros para XOR bit a bit. Ele não é um operador de exponenciação: Java não possui **. A especificação da linguagem Java define as duas formas de ^.

Escolha a forma booleana para condições e a forma inteira para bits ou máscaras. O operador está disponível nas versões atuais do Java; os exemplos foram executados com OpenJDK 17.0.20.1, enquanto a preparação consultou as informações da versão atual do JDK 26.

Usar XOR com valores booleanos

Para dois operandos booleanos, XOR é true apenas quando os operandos são diferentes. A tabela-verdade é simples:

Esquerda Direita left ^ right
false false false
false true true
true false true
true true false

Ao contrário de && e ||, ^ avalia os dois operandos. Não o use no lugar de uma guarda de curto-circuito como value != null && value.isReady(): a chamada de método ainda será avaliada. Use-o quando for seguro avaliar as duas expressões booleanas e a regra for “exatamente uma”.

Este exemplo testado mostra XOR booleano e XOR inteiro juntos:

public class BooleanAndIntegerXor {
  public static void main(String[] args) {
    System.out.println(true ^ false);
    System.out.println(true ^ true);
    System.out.println(0b1100 ^ 0b1010);
  }
}

Saída:

true
false
6

As duas primeiras linhas mostram a regra booleana. Para inteiros, 0b1100 ^ 0b1010 produz 0b0110, ou 6 em decimal: cada bit do resultado é 1 somente onde os bits de entrada diferem.

Usar XOR com valores inteiros e máscaras

A forma bit a bit aceita tipos primitivos inteiros como byte, short, char, int e long. O Java aplica promoção numérica binária antes da operação, portanto expressões com tipos inteiros menores normalmente têm resultado int. float e double não podem ser operandos XOR. Faça cast apenas quando o tipo de destino realmente exigir; um cast pode descartar bits.

XOR é útil para alternar bits selecionados. Se flags for um inteiro e mask identificar os bits a alterar, flags ^ mask inverte exatamente esses bits. Aplicar a mesma máscara de novo restaura os bits originais, pois x ^ y ^ y é igual a x. Essa propriedade reversível ajuda na manipulação controlada de bits, mas não substitui uma lógica de aplicação mais clara.

Encontrar um valor sem par

Um uso compacto de XOR inteiro encontra um valor quando todos os demais aparecem exatamente duas vezes. Valores iguais se cancelam porque x ^ x é 0 e 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);
  }
}

Saída:

9

Esta técnica depende de condições de limite; não é um algoritmo geral para encontrar um número único. Ela funciona apenas quando um valor está sem par e todos os demais aparecem exatamente duas vezes. Por exemplo, ela não identifica um único valor se outro aparecer três vezes. Escolha uma abordagem de contagem quando a regra de ocorrências for diferente ou quando também precisar das frequências.

Preferir alternativas claras quando couberem

Use != para comparar a desigualdade entre dois valores booleanos; ele pode comunicar a intenção mais diretamente do que ^. Use & 1 para verificar se um inteiro é par ou ímpar: a operação de paridade é AND, não XOR. Embora trocar duas variáveis com XOR seja um truque conhecido, uma variável temporária ou atribuição comum é mais clara em Java e evita erros de alias.

A distinção principal é simples: ^ significa OU exclusivo para valores boolean e XOR bit a bit para valores inteiros. Verifique os tipos dos operandos, lembre que os dois lados booleanos são avaliados e declare as suposições sobre os dados antes de depender do cancelamento de duplicados.