Segredos

Segredos

Exercício de aprendizagem

Introdução

O Crystal tem operadores bit a bit para manipular Int no nível binário.

Operadores de deslocamento

O Crystal tem operadores de deslocamento para deslocar bits para a esquerda (<<) ou para a direita (>>).

Deslocamento à esquerda (<<)

O operador de deslocamento à esquerda (<<) desloca os bits para a esquerda. O valor a deslocar é especificado do lado esquerdo e o número de posições a deslocar fica do lado direito.

0b0010 << 1
# => 0b0100

0b0010 << 2
# => 0b1000

Se o número for negativo, o deslocamento será para a direita.

0b0010 << -1
# => 0b0001

Deslocamento à direita (>>)

O operador de deslocamento à direita (>>) desloca os bits para a direita. Assim como o operador de deslocamento à esquerda, o valor a deslocar é especificado à esquerda e o número de posições a deslocar fica à direita.

0b0100 >> 1
# => 0b0010

0b0100 >> 2
# => 0b0001

E, da mesma forma, o operador deslocará para a esquerda se o número for negativo.

0b0100 >> -1
# => 0b1000

Operadores binários

O Crystal tem 3 operadores binários (&, |, ^) e um operador ~ para realizar operações bit a bit.

AND bit a bit (&)

O operador binário AND (&) realiza um AND bit a bit em dois valores. Ele compara cada bit do primeiro valor com o bit na mesma posição do segundo valor. O bit resultante é definido como 1 se ambos os bits forem 1. Caso contrário, ele é definido como 0.

0b0011 & 0b1010
# => 0b0010

OR bit a bit (|)

O operador binário OR (|) realiza um OR bit a bit em dois valores. Ele também 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 resultante é definido como 1. Caso contrário, ele é definido como 0.

0b0011 | 0b1010
# => 0b1011

XOR bit a bit (^)

O operador binário XOR (^) realiza um XOR bit a bit. Assim como os operadores AND bit a bit 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, ele é 0.

0b0011 ^ 0b1010
# => 0b1001

NOT bit a bit (~)

Por fim, o operador NOT bit a bit (~) inverte cada um dos bits do valor. Diferente dos outros operadores binários, este é um operador unário, que opera apenas sobre o valor à direita.

~0b1110_0010
# => 0b0001_1101

Instruções

Seu amigo acabou de lhe enviar uma mensagem com um segredo importante. Para não facilitar a leitura por outras pessoas, a mensagem foi criptografada usando uma série de manipulações de bits. Você vai precisar escrever um programa para ajudar a descriptografar a mensagem.

1. Desloque os bits de volta

O primeiro passo para descriptografar a mensagem é desfazer o deslocamento do processo de criptografia, movendo os bits de volta para a esquerda. O número de posições a deslocar pode variar entre mensagens.

Implemente o método Secrets.shift_back, que recebe um valor e o número de posições a deslocar para a esquerda.

Secrets.shift_back(0b0001, 2)
# => 0b0100

2. Aplique uma máscara de bits

O próximo passo é aplicar uma máscara de bits para extrair o valor de determinados bits. A máscara é aplicada fazendo um AND bit a bit entre o valor e a máscara.

Implemente o método Secrets.apply_mask, que recebe um valor e aplica uma máscara.

Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100

3. Defina alguns bits

Deslocar bits para a esquerda adicionou alguns novos bits 0. Alguns desses novos bits precisam ser definidos como 1. O OR bit a bit é útil para definir certos bits como 1 e preservar os demais.

Implemente o método Secrets.set_bits, que recebe dois valores e realiza um OR bit a bit.

Secrets.set_bits(0b0110, 0b0101)
# => 0b111

4. Reverta o XOR

Parte do processo de criptografia aplica um XOR com um valor combinado. Para voltar ao valor original, basta fazer XOR novamente entre o valor criptografado e o valor combinado. No entanto, devido a um mal-entendido, seu amigo inverteu os bits do valor combinado (ou seja, aplicou um NOT bit a bit ao valor combinado) antes de aplicar o XOR.

Implemente o método Secrets.reverse_xor, que recebe os valores criptografado e combinado e calcula o valor original.

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar Segredos?

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