Segredos

Segredos

Exercício de aprendizagem

Introdução

Manipulação de bits

O Java tem operadores para manipular os bits de um byte, short, int, long ou char.

Operadores de deslocamento

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

Operações bit a bit

AND bit a bit

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
OR bit a bit

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
XOR bit a bit

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
NOT bit a bit (~)

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

Instruções

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.

1. Desloque os bits de volta

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

2. Defina alguns bits

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

3. Inverta bits específicos

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

4. Zere bits específicos

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
Editar via GitHub O link abre em uma nova janela ou aba
Java Exercism

Tudo pronto para começar Segredos?

Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.