O Java tem operadores para manipular os bits de um byte, short, int, long ou char.
Use << para deslocar os bits para a esquerda e >> para deslocar para a direita.
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
O operador << sempre insere 0s no lado direito.
No entanto, o >> insere o mesmo bit que o bit mais à esquerda (1 se o número for negativo ou 0 se for positivo).
// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
Use >>> quando quiser que 0s sejam inseridos ao deslocar para a direita.
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
O operador AND bit a bit (&) recebe dois valores e faz uma operação AND em cada bit.
Ele compara cada bit do primeiro valor com o bit na mesma posição do segundo valor.
Se os dois forem 1, o bit do resultado é 1.
Caso contrário, o bit do resultado é 0.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
O operador OR bit a bit (|) recebe dois valores e faz uma operação OR em cada bit.
Ele compara cada bit do primeiro valor com o bit na mesma posição do segundo valor.
Se qualquer um dos bits for 1, o bit do resultado é 1.
Caso contrário, é 0.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
O operador XOR bit a bit (^) faz uma operação XOR bit a bit em dois valores.
Assim como os operadores AND e OR bit a bit, ele compara cada bit do primeiro valor com o bit na mesma posição do segundo valor.
Se apenas um deles for 1, o bit resultante é 1.
Caso contrário, é 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)Por último, o operador NOT bit a bit (~) inverte cada bit.
Diferente dos operadores anteriores, este é um operador unário, que age sobre um único valor.
~0b0110_0101;
// # => 0b1001_1010
Seu amigo acabou de te enviar uma mensagem com um segredo importante. Como não queria que outras pessoas conseguissem lê-la com facilidade, a mensagem foi criptografada por meio de uma série de manipulações de bits. Você vai precisar escrever os métodos que ajudam a descriptografar a mensagem.
O primeiro passo para descriptografar a mensagem é desfazer o deslocamento feito na criptografia, deslocando os bits de volta para a direita. Haverá outros passos no processo de descriptografia que assumem que 0s são inseridos pelo lado esquerdo.
Implemente o método Secrets.shiftBack, que recebe um valor e o número de posições a deslocar e realiza o deslocamento.
Secrets.shiftBack(0b1001, 2);
# => 0b0010
Em seguida, há alguns bits que precisam ser definidos como 1.
Implemente o método Secrets.setBits, que recebe um valor e uma máscara e retorna o resultado de definir como 1 os bits do valor.
Um bit do valor deve ser definido como 1 quando o bit correspondente na máscara também for 1.
Todos os outros bits devem permanecer inalterados.
Secrets.setBits(0b0110, 0b0101);
# => 0b0111
Alguns bits são invertidos durante a criptografia. Eles precisarão ser invertidos de volta para descriptografar a mensagem.
Implemente o método Secrets.flipBits, que recebe um valor e a máscara.
A máscara indica quais bits do valor devem ser invertidos.
Se o bit for 1 na máscara, o bit é invertido no valor.
Todos os outros bits permanecem inalterados.
Secrets.flipBits(0b1100, 0b0101);
# => 0b1001
Por fim, também há certos bits que sempre descriptografam para 0.
Implemente o método Secrets.clearBits, que recebe um valor e uma máscara.
Os bits em value devem ser definidos como 0 quando o bit na máscara for 1.
Todos os outros bits devem permanecer inalterados.
Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.