Segredos

Segredos

Exercício de aprendizagem

Introdução

Operações bit a bit

As operações bit a bit permitem manipular dígitos individuais dentro de números binários.

O Elm fornece vários operadores bit a bit em seu módulo Bitwise

Operações básicas

Modificar bits individuais de um número é chamado de mascaramento. Uma máscara é um número em que bits específicos foram definidos de uma maneira específica para manipular outro número usando operadores bit a bit como and, or e xor.

and

and combina dois números mantendo apenas os bits que são 1 nos dois. Isso é útil para verificar se um bit individual está definido. Por exemplo, para verificar se o quarto bit de um número está definido como 1, aplique and nele com uma máscara 01000 (8 em decimal) e veja se o resultado é diferente de zero:

Bitwise.and 13 8 --> 8
--  13 = 01101
--   8 = 01000
-- and = 01000 = 8
or

or combina dois números definindo cada bit como 1 se ele for 1 em um dos números ou em ambos. Isso é útil para definir um bit específico como 1. Por exemplo, para definir o segundo bit em 10101, aplique or nele com a máscara 00010:

Bitwise.or 21 2 --> 23
-- 21 = 10101
--  2 = 00010
-- or = 10111 = 23
Ou exclusivo (xor)

xor combina dois números definindo cada bit como 1 se ele for 1 em um número, mas 0 no outro. Isso é útil para inverter um bit para seu valor oposto:

Bitwise.xor 20 5 --> 17
--  20 = 10100
--   5 = 00101
-- xor = 10001 = 17
Complemento

complement inverte cada bit de um número (0 se torna 1, 1 se torna 0).

Observe que isso fará com que números positivos se tornem negativos e números negativos se tornem positivos. Isso acontece porque números negativos em binário são representados com 1 na posição mais à esquerda.

Bitwise.complement 21 --> -22
--         21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
Deslocamento de bits

Os operadores a seguir movem bits para a esquerda ou para a direita em um número especificado de posições, multiplicando ou dividindo efetivamente por potências de 2.

shiftLeftBy move bits para a esquerda, preenchendo com 0 do lado direito. Por exemplo, para deslocar 21 três posições para a esquerda:

Bitwise.shiftLeftBy 3 21 --> 168
--  21 = 10101
-- shiftLeftBy 3 = 10101000 = 168

Isso é o mesmo que dizer 21 * 2^3 = 21 * 2 * 2 * 2 = 168

shiftRightBy: move bits para a direita:

Bitwise.shiftRightBy 2 21 --> 5
--  21 = 10101
-- shiftRightBy 2 = 00101 = 5

Deslocar duas posições para a direita é o mesmo que divisão inteira por 4.

Observe que essa função duplica qualquer valor que esteja no bit mais à esquerda. Assim, números negativos continuarão negativos:

Bitwise.shiftRightBy 3 -21 --> -3
--  -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3

Se você quiser deslocar para a direita e preencher com zeros, use shiftRightZfBy:

Bitwise.shiftRightZfBy 3 -21 --> 536870909
--  -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909

Instruções

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

1. Desloque os bits de volta

O primeiro passo para descriptografar a mensagem é desfazer o deslocamento do processo de criptografia, deslocando os bits de volta para a direita. Haverá outros passos no processo de descriptografia que presumem que 0s são inseridos pelo lado esquerdo.

Implemente a função shiftBack, que recebe um número de posições a deslocar e um valor, e realiza o deslocamento.

shiftBack 2 42 --> 10

2. Defina alguns bits

Em seguida, há alguns bits que precisam ser definidos como 1.

Implemente a função setBits, que recebe uma máscara e um valor e retorna o resultado de definir como 1 os bits do valor. Um bit do valor deve ser definido como 1 onde o bit na máscara também for 1. Todos os outros bits devem permanecer inalterados.

setBits 66 212 --> 64

3. Inverta bits específicos

Alguns bits são invertidos durante a criptografia. Será preciso invertê-los de volta para descriptografar a mensagem.

Implemente a função flipBits, que recebe uma máscara e um valor. 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.

flipBits 23 157 --> 138

4. Limpe bits específicos

Também há certos bits que sempre resultam em 0 ao serem descriptografados.

Implemente a função clearBits, que recebe uma máscara e um valor. Os bits em value devem ser definidos como 0 onde o bit na máscara for 1. Todos os outros bits devem permanecer inalterados.

clearBits 2 15 --> 13

5. Descriptografe uma mensagem

Agora que você já tem todas as funções de que precisa, pode decodificar a mensagem do seu amigo. Implemente a função decrypt, que realiza as seguintes operações:

  1. Defina os bits a partir do ano em que seu amigo nasceu (1996)
  2. Inverta o resultado com o ano em que vocês se conheceram (2009)
  3. Desloque os bits de volta pela quantidade de aulas que vocês têm juntos (5)
  4. Limpe o primeiro e o quinto bit.
decrypt 380182 --> 11840

Implemente decrypt usando todas as funções que você implementou nas tarefas anteriores.

Editar via GitHub O link abre em uma nova janela ou aba
Elm Exercism

Tudo pronto para começar Segredos?

Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.