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!