Entenda os Operadores Lógicos, Bitwise e Bit Shift!
- #Java
Para entender Bitwise e Bit Shift, primeiro vamos relembrar os operadores lógicos das aulas:
Operadores Lógicos
Conjunção
Operação Lógica que só é verdadeira quando ambos os operandos ou expressões são verdade.
Os dois lados precisam ser TRUE para o resultado ser TRUE.
Se apenas um lado for FALSE, o resultado será FALSE.
Simbologia: &&
Terminologia: AND
Disjunção
Operação Lógica que só é falsa quando ambos os operandos ou expressões são falsos.
Tendo TRUE em pelo menos um lado a operação será TRUE.
Para ser FALSE os dois lados precisam ser FALSE.
Simbologia: ||
Terminologia: OR
Disjunção Exclusiva
Operação Lógica que só é verdadeira quando ambos os operandos ou expressões são opostos.
Para ser TRUE os dois lados precisam ser diferentes.
Para ser FALSE os dois lados precisam ser iguais.
Simbologia: ^
Terminologia: XOR
Negação
Operação que inverte o valor lógico de um operando ou expressão.
Simbologia: !
Terminologia: inversão
Considerando a lógica acima, vamos ao bitwise.
Em Java é possível realizar algumas operações lógicas entre valores numéricos inteiros. Neste caso, as operações lógicas ocorrem no nível de bits dos números, ou seja, as operações lógicas ocorrem com as representações binárias dos números.
Para realizar uma operação lógica com números inteiros (a nível de bits) com java basta utilizarmos os operadores:
& (AND - E)
| (OR - OU)
^ (XOR - OU EXCLUSIVO).
No mesmo sentido dos operadores lógicos. Agora vamos considerar o código abaixo.
public class OperacoesBitwise {
public static void main(String[] args) {
int a = 10;
int b = 12;
System.out.println(a + " | " + b + " = " + (a | b));
System.out.println(a + " & " + b + " = " + (a & b));
System.out.println(a + " ^ " + b + " = " + (a ^ b));
a = 9;
b = 7;
System.out.println(a + " | " + b + " = " + (a | b));
System.out.println(a + " & " + b + " = " + (a & b));
System.out.println(a + " ^ " + b + " = " + (a ^ b));
}
}
A saída será a seguinte:
10 | 12 = 14
10 & 12 = 8
10 ^ 12 = 6
9 | 7 = 15
9 & 7 = 1
9 ^ 7 = 14
Entendendo o resultado
- Como esta operação acontece no nível binário, primeiro termos que converter os números para binário.
- Com a conversão em binário de 10 e 12, podemos seguir para o passo a passo.
Conversão em binário:
AND - E
Considere 1 como TRUE e o 0 como FALSE:
OR - OU
Considere 1 como TRUE e o 0 como FALSE:
XOR - OU EXCLUSIVO
Considere 1 como TRUE e o 0 como FALSE:
Como treino para reforçar o entendimento, vocês podem fazer a operação entre 9 e 7. 😉
Operadores de Bit Shift
Também trabalham com números inteiros a nível de bits, porém o seu trabalho está no deslocamento aritmético e deslocamento lógico.
Parece complexo? Apenas um pouco, ele apenas desloca os 0 e 1 para esquerda ou direita.
Deslocamento aritmético: << ou >>
Deslocamento lógico: >>>
Atenção: Não existe o operador <<<
porque tanto o deslocamento aritmético quanto o deslocamento lógico para esquerda se comportam da mesma maneira.
Vamos analisar cada um dos operadores.
Operador <<
Título da coluna = operação realizada
1º linha número normal
2º linha a operação. Vermelho removido. Verde adicionado.
3º linha resultado final
Operador >>
Título da coluna = operação realizada
1º linha número normal
2º linha a operação. Vermelho removido. Verde adicionado.
3º linha resultado final
Operador >>>
Título da coluna = operação realizada
1º linha número normal
2º linha a operação. Vermelho removido. Verde adicionado.
3º linha resultado final
Conversão em binário
Para entender como converter um número em binário:
De exemplo o número 25, estamos convertendo ele base uma base 2 (binário), então vamos pegar o número 25 e dividir ele repetidamente por 2, até o resultado da divisão ser menor que 2. Note que o resto da divisão sempre será 0 ou 1.
25 / 2 = 12 com resto 1
12 / 2 = 6 com resto 0
6 / 2 = 3 com resto 0
3 / 2 = 1 com resto 1
Deixei em laranja os números que iremos utilizar para fazer o binário.
Primeiro pegamos o último resultado e depois pegamos os restos da última divisão feita seguindo em direção a primeira divisão feita.
25 em binário = (resultado da divisão 3/2) + (resto da divisão 3/2) + (resto da divisão 6/2) + (resto da divisão 12/2) + (resto da divisão 25/2)
25 em binário = 1 1 0 0 1
E a situação inversa? Binário para decimal?
Primeiro temos que organizar o número em uma série de potencias de 2 baseado em sua posição:
Ou seja, o último fica com 2⁰, o penúltimo 2¹, assim por diante. Agora vamos seguir.
Você vai pegar as potências de 2, calcular o resultado e multiplicar pelo bit.
Pra ficar mais claro, em azul o resultado da potência, em laranja o número em bit, em verde o resultado da potência multiplicado pelo bit.
2⁰ = 1 * 1 = 1
2¹ = 2 * 0 = 0
2² = 4 * 0 = 0
2³ = 8 * 1 = 8
2⁴ = 16 * 1 = 16
Agora vamos somar o resultado (números em verde):
1 + 0 + 0 + 8 + 16 = 25
É isso 😁