Bitwise operators são operadores que manipulam bits, deslocando pra esquerda, ou pra direita, invertendo, fazendo operações lógicas…
Servem para você realizar operações binárias com variáveis numéricas Aqui e acolá aparecem coisas que a gente precisa usar esses operadores. (Você já deve saber o que são operações binárias com números, deslocamento, essas coisas, senão não vai entender o exemplo que eu vou dar).
Um exemplo que eu uso os operadores de deslocamento (quando programo pra dispositivos restritos, como cartões e celulares): colocar uma variável short (16 bits = 2 bytes) em um array de bytes. Compare assim: se eu tenho o número 1099 e eu quero guardar em um array de “dígitos”, eu tenho que guardar assim:
numero n = 0;
numero = digitos[0] * 1000; // 1000
numero += digitos[1] * 100; // 0
numero += digitos[2] * 10; // 90
numero += digitos[3]; // 9
// numero agora é 1099 de novo
Pra fazer isso entre short e byte, a idéia é a mesma, porém, ao invés de usar multiplicadores na base 10 (como foi nesse exemplo), a gente vai usar multiplicadores na base 2 (que são os deslocamentos binários).
short s = (short) 1099; // 00000100 01001011
byte[] b = new byte[2]; // porque um short tem 2 bytes
b[0] = (byte) (s >>> 8); // desloca s 8 bits pra direita, ficando apenas 00000100
b[1] = (byte) (s & 0xFF); // "apaga" o byte mais significativo, com um E lógico, restando apenas o menos significativo
Pronto, o valor de s está dividido em dois bytes. Pra juntar tudo, é só fazer a operação inversa:
short t = 0;
t = (short) (b[0] << 8);
t += (short) b[1];
Eu não cheguei a testar exatamente esse exemplo, pode ter alguma coisa aí que dê errado, mas a idéia é essa. Não são muitos os casos que você vai precisar desses operadores, mas isso depende de pra qual plataforma você tá programando.