Operadores Java Bitwise: lista e funções
Os operadores Java bit a bit, também conhecidos como operadores Bitwise, permitem manipular bits individuais conforme necessário. No total, existem sete operadores, todos com uma estrutura muito semelhante. Além disso, as regras que seguem são muito fáceis de entender.
O que são os operadores bitwise do Java e para que servem?
Os operadores Java são uma ferramenta muito importante se estiver a trabalhar com a linguagem de programação. Entre eles, encontram-se os operadores Java Bitwise, que permitem manipular bits. Se quiser consultar valores binários bit a bit, precisa de um operador Bitwise. Pode aplicá-lo aos tipos de dados inteiros (byte, char, int, short, long).
Embora não vá precisar destes operadores diariamente, a sua utilidade será evidente em determinadas situações: por exemplo, se quiser economizar espaço ao converter dados, se quiser usar o operador XOR ou se quiser alterar um único bit. Além disso, os operadores ao nível do bit têm um grande peso nas operações de circuitos mais complexos. Por tudo isso, vale a pena entender o funcionamento destes operadores.
Que operadores bitwise existem em Java?
Existem sete operadores Bitwise diferentes em Java. Para compreendê-los melhor, trabalha-se com os operandos «a» e «b».
- ~ (complemento ou «Bitwise not»): este operador inverte cada bit. Ou seja, um 0 torna-se um 1 e um 1 torna-se um 0.
- & (“Bitwise and”): este operador resulta em 1 se ambos os operandos também forem 1. Caso contrário, é exibido um 0.
- | («Bitwise Or»): este operador resulta em 1 se um dos dois operandos também tiver este valor.
- ^ (XOR ou “Bitwise exclusive OR”): este operador resulta em 0 se os operandos comparados tiverem o mesmo valor. Caso contrário, gera um 1.
- << (deslocamento para a esquerda): este operador desloca o operando “a” para a esquerda em “b” posições. Se houver espaços, eles são preenchidos com 0.
- >> (deslocamento à direita com sinal, aritmético): este operador desloca todos os bits de «a» para a direita em «b» posições. Se o bit mais significativo estava definido antes da operação, ele permanece também após a operação, portanto, se o número for negativo, ele continua negativo.
- >>>> (deslocamento à direita sem sinal, lógico): este operador desloca os bits de “a” em “b” posições para a direita. Os espaços são sempre preenchidos com 0.
Bitwise not
O operador «Bitwise not» do Java é representado por um til (~). Ele inverte todos os bits e, portanto, converte zeros em uns e uns em zeros. No exemplo apresentado abaixo, é utilizado o número decimal 20, que em número binário é: 10100. Ao aplicar o operador, cada bit é invertido, convertendo 10100 em 01011. Este é o valor da expressão “~20”. Se convertermos novamente este último número binário em um número decimal, obtemos o valor -21. Com o comando Java System.out.println, você pode imprimir o resultado a partir do seguinte código:
public clase Main {
public static void main(String[] args) {
int valor1 = 20;
System.out.println(~Valor1);
}
}javaSe tudo tiver sido introduzido corretamente, o resultado «-21» deverá ser apresentado.
E bit a bit
Graças a este operador, dois números são comparados na sua forma binária, bit a bit. O primeiro bit do primeiro número é comparado com o primeiro bit do segundo número, o segundo bit do primeiro número com o segundo bit do segundo número e assim sucessivamente. Se ambos os bits forem 1, também se obtém um 1. Se não for esse o caso (os dois bits são 0 ou apenas um é 0), obtém-se um 0. Para o exemplo apresentado, são utilizados os números decimais 18 e 25 na sua notação binária: 18 é 10010 e 25 é 11001. Agora, os dois números são comparados entre si para gerar um terceiro número a partir deles. Para uma visão mais clara, escreve-se um abaixo do outro:
18 = 10010 25 = 11001
O primeiro bit de dois números é 1, portanto o resultado também começará por 1. Embora o segundo bit de 25 também seja 1, o segundo bit de 18 é 0, portanto o resultado incluirá um 0 nessa posição. Comparando os dois números bit a bit, obtém-se finalmente o número binário 10000. Ao convertê-lo em número decimal, o resultado é 16.
O código ficaria assim:
public clase Main {
public static void main(String[] args) {
System.out.println(18&25);
}
}javaNa consola seria exibido «16».
Bitwise or
No operador «Bitwise OR» do Java também se comparam bit a bit dois números em notação binária. Neste caso, porém, basta que apenas um dos dois bits comparados tenha o valor 1 para obter o resultado 1. Como exemplo, tomamos novamente os números 18 e 25 do exemplo anterior:
18 = 10010 25 = 11001
Como todos os bits (exceto o terceiro dígito) contêm pelo menos um 1, este terceiro número resulta em: 11011. Convertido, obtemos 27.
Em código, este exemplo é representado como mostrado:
public clase Main {
public static void main(String[] args) {
System.out.println(18|25);
}
}javaXOR
XOR ou “Bitwise exclusive OR” (^) é semelhante ao Bitwise OR. No entanto, no caso do XOR, apenas um 1 é impresso se apenas um dos dois bits comparados for 1. O exemplo torna isso mais claro:
18 = 10010 25 = 11001
Como os dois primeiros bits comparados com 1, o valor apresentado é 0. No entanto, o segundo bit de 18 é 0 e o de 25 é 1. Neste caso, obtém-se 1 como resultado, porque apenas um dos dois bits comparados contém o valor 1. Se continuar, obtém-se 01011. Em notação decimal, corresponde a 11.
Este é o código correspondente:
public clase Main {
public static void main(String[] args) {
System.out.println(18^25);
}
}javaDeslocamento para a esquerda
Com o deslocamento para a esquerda, os bits são deslocados para a esquerda em «b» posições. Os espaços em branco resultantes são preenchidos com 0. Se tomarmos como valor «a» o 20, ou seja, 10100 em notação binária, e deslocarmos um valor «b» 2, obtemos o valor c 1010000. Neste caso, é necessário incluir dois zeros no final. 1010000 corresponde ao valor decimal 80.
No código, pode ser visto como mostrado:
public clase Main {
public static void main(String[] args) {
int a = 20
int b = 2
int c = (a << b);
System.out.println(c);
}
}javaDeslocamento para a direita com sinal
O deslocamento para a direita funciona no sentido contrário. Deslocamos os bits de «a» para a direita em «b» posições e assim obtemos c. Os últimos bits são omitidos. Se deslocarmos 20 ou 10100 duas posições para a direita, o resultado é 00101 ou 5.
O código é:
public clase Main {
public static void main(String[] args) {
System.out.println(20 >> 2);
}
}javaÉ importante destacar que os espaços são preenchidos com 0 se a for um número positivo. Se for negativo, os espaços são substituídos por 1.
Deslocamento para a direita sem sinal
O operador Java Bitewise deslocamento à direita sem sinal (>>>) funciona exatamente da mesma maneira. A única diferença é que os espaços criados no lado esquerdo por um deslocamento à direita são sempre preenchidos com 0. Consequentemente, sempre se obtém números positivos, mesmo que “a” fosse negativo.