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
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 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 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
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
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
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
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.
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
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
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
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
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:
decrypt 380182 --> 11840
Implemente decrypt usando todas as funções que você implementou nas tarefas anteriores.
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.