O Crystal tem operadores bit a bit para manipular Int ao nível dos bits.
O Crystal tem operadores de deslocamento para deslocar bits para a esquerda (<<) ou para a direita (>>).
<<)O operador de deslocamento à esquerda (<<) desloca os bits para a esquerda.
O valor a deslocar indica-se do lado esquerdo e o número de posições a deslocar do lado direito.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
Se o número for negativo, desloca para a direita.
0b0010 << -1
# => 0b0001
>>)O operador de deslocamento à direita (>>) desloca os bits para a direita.
Tal como o operador de deslocamento à esquerda, o valor a deslocar indica-se à esquerda e o número de posições a deslocar à direita.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
E, da mesma forma, o operador desloca para a esquerda se o número for negativo.
0b0100 >> -1
# => 0b1000
O Crystal tem 3 operadores binários (&, |, ^) e um operador ~ para efetuar operações bit a bit.
&)O operador binário AND (&) efetua um AND bit a bit sobre dois valores.
Compara cada bit do primeiro valor com o bit na mesma posição do segundo valor.
O bit resultante é 1 se ambos os bits forem 1.
Caso contrário, é 0.
0b0011 & 0b1010
# => 0b0010
|)O operador binário OR (|) efetua um OR bit a bit sobre dois valores.
Compara também cada bit do primeiro valor com o bit na mesma posição do segundo valor.
Se um dos bits for 1, o bit resultante é 1.
Caso contrário, é 0.
0b0011 | 0b1010
# => 0b1011
^)O operador binário XOR (^) efetua um XOR bit a bit.
Tal como os operadores AND bit a bit e OR bit a bit, 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.
0b0011 ^ 0b1010
# => 0b1001
~)Por último, o operador NOT bit a bit (~) inverte cada um dos bits do valor.
Ao contrário dos outros operadores binários, este é um operador unário, que atua apenas sobre o valor à direita.
~0b1110_0010
# => 0b0001_1101
O teu amigo acabou de te enviar uma mensagem com um segredo importante. Como não queria que fosse fácil para os outros lê-la, a mensagem foi encriptada com uma série de manipulações de bits. Vais precisar de escrever um programa para ajudar a desencriptar a mensagem.
O primeiro passo para desencriptar a mensagem é desfazer o deslocamento do processo de encriptação, deslocando os bits de volta para a esquerda. O número de posições a deslocar pode variar de mensagem para mensagem.
Implementa 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
O passo seguinte é aplicar uma máscara de bits para extrair o valor de determinados bits. A máscara aplica-se efetuando um AND bit a bit entre o valor e a máscara.
Implementa o método Secrets.apply_mask, que recebe um valor e aplica uma máscara.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
Deslocar bits para a esquerda acrescentou alguns bits 0 novos. Alguns destes novos bits têm de ser definidos como 1. O OR bit a bit é útil para definir certos bits como 1 e preservar os restantes.
Implementa o método Secrets.set_bits, que recebe dois valores e efetua um OR bit a bit.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Parte do processo de encriptação aplica um XOR com um valor combinado. Para voltar ao valor original, basta aplicar novamente o XOR ao valor encriptado com o valor combinado. No entanto, devido a um mal-entendido, o teu amigo inverteu os bits do valor combinado (ou seja, aplicou um NOT bit a bit ao valor combinado) antes de aplicar o XOR.
Implementa o método Secrets.reverse_xor, que recebe os valores encriptado e combinado e calcula o valor original.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.