Dúvida básica: operador &=

Bom dia, pessoal.

Eu estou tendo dificuldade em entender como funciona o operador &=.

Criei o seguinte teste para ver se conseguia compreender o funcionamento, mas até agora nada:

public static void main(String[] args) {
	int x = 10;
	x &= 0;
	System.out.println(x);
}

Do jeito que está, imprime 0.
Quando troco 0 por 1, imprime 0.
Quando troco 0 por 2, imprime 2.
Quando troco 0 por 3, imprime 2.
Quando troco 0 por 4, imprime 0.
Quando troco 0 por 5, imprime 0.
Quando troco 0 por 6, imprime 2.
Quando troco 0 por 7, imprime 2.
Quando troco 0 por 8, imprime 8.
Quando troco 0 por 9, imprime 8.
Quando troco 0 por 10, imprime 10.

Se eu entendi direito, x &= 0 é o mesmo que x = x & 0, ou seja, x recebe x E 0. Mas falho em perceber como se dá a operação que faz x imprimir valores que, pra mim, não fazem sentido.

Obrigado!

Esse & é o operador bitwise “AND”. Basicamente, ele opera no nível dos bits do número. Se ambos os bits forem 1, o resultado é 1. Se algum dos bits não for 1, o resultado é zero.

Então para entender como funciona, temos que converter os números para a base 2 (ou simplesmente “binário”). No caso, temos x = 10, e 10 em binário é 1010.

Se fizermos x & 1, por exemplo:

1010  <-- 10 em binário
0001  <-- 1 em binário
----
0000  <-- resultado de 10 & 1

No caso, o operador & faz a operação bit a bit (ele compara o primeiro bit de um número com o primeiro bit do outro: se ambos forem 1, o resultado é 1, senão é zero; depois faz o mesmo para o segundo bit de cada número, depois com o terceiro, etc). No caso, o resultado é 0000, que corresponde ao número zero.

Agora se fizermos 10 & 2

1010  <-- 10 em binário
0010  <-- 2 em binário
----
0010  <-- resultado de 10 & 2

Agora veja que o resultado é 0010, que corresponde ao número 2.


Para ser mais exato, um int em Java tem 32 bits, então o 10 seria na verdade 00000000000000000000000000001010. Mas a ideia é a mesma (como os primeiros bits são zero, não muda o resultado):

00000000000000000000000000001010  <-- 10 em binário
00000000000000000000000000000010  <-- 2 em binário
--------------------------------
00000000000000000000000000000010  <-- resultado de 10 & 2 (que é "2")
3 curtidas

Entendi, Hugo! Muito obrigado!