Operador XOR

Pessoa, boa tarde.

Poderiam me explicar por que a saída abaixo é:

f = 3
g = 1

public class OperadorXor {

public static void main (String[] args) {
int f = 1;
int g = 2;

  f = f ^ g;
  g = g ^ f;

  System.out.println("f="+f);
  System.out.println("g="+g);

}
}

Obrigado.

pois

f = f ^ g;
// f = 01; g = 10 (binario)
// então f = 01 ^ 10 = 11; portanto f = 3;

g = g ^ f;
// f agora é 3; f = 11
// g = 10;
// então g = 10 ^ 11 = 01; portanto g = 1;
1 curtida

Abaixo as tabelas verdade para ajudar a entender.

AND
false & false = false
false & true  = false
true  & false = false
true  & true  = true 

OR
false | false = false
false | true  = true 
true  | false = true 
true  | true  = true 

XOR
false ^ false = false
false ^ true  = true 
true  ^ false = true 
true  ^ true  = false
1 curtida

Entendi agora que existe uma conversão da base decimal pra binária e o resultado volta pra base decimal. Porém, surgiu uma outra dúvida. Como se calcula:

f = 01 ^ 10 = 11; (Por que deu 11?)
g = 10 ^ 11 = 01; (Por que deu 01?)

Como se faz esses cálculos?

Obrigado

Através de Álgebra de Boole.
Pode se basear nas tabelas verdade que eu postei antes.
Se ficou difícil entender com true e false, substitua o true por 1 e o false por 0:

AND
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

OR
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

XOR
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Então, vamos separar os bits dos seus números.
O número 01 tem dois bits onde o bit a = 1 e o bit b = 0.
O número 10 tem dois bits onde o bit a = 0 e o bit b = 1.

Primeiro vamos calcular o bit a do resultado.
Então a conta será 1 ^ 0, onde 1 é o bit a do primeiro número e 1 é o bit a do segundo número.
Olhando a tabela verdade do XOR temos que 1 ^ 0 = 1, então o bit a do resultado será 1.

Agora vamos calcular o bit b do resultado.
Então a conta será 0 ^ 1, onde 0 é o bit b do primeiro número e 0 é o bit b do segundo número.
Olhando a tabela verdade do XOR temos que 0 ^ 1 = 1, então o bit b do resultado será 1.

Assim o resultado final de 01 ^ 10 é igual à 11.

Podemos fazer o cálculo conforme o quadro abaixo:

   | b | a | bit
   +---+---+
   | 0 | 1 | primeiro número
 ^ +---+---+ 
   | 1 | 0 | segundo número
 = +---+---+
   | 1 | 1 | resultado

Tente utilizar o quadro acima e a tabela verdade para calcular 10 ^ 11.

:slight_smile:

1 curtida

Obrigado Staroski e diego12 pela ajuda. Nossa… muito didática e esclarecedora. Abraços.