Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Crystal tiene operadores bit a bit para manipular Int a nivel binario.

Operadores de desplazamiento

Crystal tiene operadores de desplazamiento para desplazar bits a la izquierda (<<) o a la derecha (>>).

Desplazamiento a la izquierda (<<)

El operador de desplazamiento a la izquierda (<<) desplaza los bits hacia la izquierda. El valor que hay que desplazar se indica a la izquierda y el número de posiciones que hay que desplazar, a la derecha.

0b0010 << 1
# => 0b0100

0b0010 << 2
# => 0b1000

Si el número es negativo, se desplazará hacia la derecha en su lugar.

0b0010 << -1
# => 0b0001

Desplazamiento a la derecha (>>)

El operador de desplazamiento a la derecha (>>) desplaza los bits hacia la derecha. Al igual que el operador de desplazamiento a la izquierda, el valor que hay que desplazar se indica a la izquierda y el número de posiciones que hay que desplazar, a la derecha.

0b0100 >> 1
# => 0b0010

0b0100 >> 2
# => 0b0001

Y, de forma similar, el operador desplazará hacia la izquierda si el número es negativo.

0b0100 >> -1
# => 0b1000

Operadores binarios

Crystal tiene 3 operadores binarios (&, |, ^) y un operador ~ para realizar operaciones bit a bit.

AND bit a bit (&)

El operador AND binario (&) realiza una operación AND bit a bit sobre dos valores. Compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor. El bit resultante se pone a 1 si ambos bits son 1. En caso contrario, se pone a 0.

0b0011 & 0b1010
# => 0b0010

OR bit a bit (|)

El operador OR binario (|) realiza una operación OR bit a bit sobre dos valores. También compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor. Si cualquiera de los dos bits es 1, el bit resultante se pone a 1. En caso contrario, se pone a 0.

0b0011 | 0b1010
# => 0b1011

XOR bit a bit (^)

El operador XOR binario (^) realiza una operación XOR bit a bit. Al igual que los operadores AND y OR bit a bit, compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor. Si solo uno de ellos es 1, el bit resultante es 1. En caso contrario, es 0.

0b0011 ^ 0b1010
# => 0b1001

NOT bit a bit (~)

Por último, el operador NOT bit a bit (~) invierte cada uno de los bits del valor. A diferencia de los demás operadores binarios, este es un operador unario, que opera solo sobre el valor de la derecha.

~0b1110_0010
# => 0b0001_1101

Instrucciones

Tu amigo acaba de enviarte un mensaje con un secreto importante. Como no quería que a otros les resultara fácil leerlo, el mensaje se ha cifrado mediante una serie de manipulaciones de bits. Tendrás que escribir un programa que te ayude a descifrar el mensaje.

1. Desplaza los bits de vuelta

El primer paso para descifrar el mensaje consiste en deshacer el desplazamiento del proceso de cifrado desplazando los bits de nuevo hacia la izquierda. El número de posiciones que hay que desplazar puede variar de un mensaje a otro.

Implementa el método Secrets.shift_back, que recibe un valor y el número de posiciones que hay que desplazar a la izquierda.

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

2. Aplica una máscara de bits

El siguiente paso es aplicar una máscara de bits para extraer el valor de determinados bits. La máscara se aplica realizando una operación AND bit a bit entre el valor y la máscara.

Implementa el método Secrets.apply_mask, que recibe un valor y le aplica una máscara.

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

3. Establece algunos bits

Al desplazar bits a la izquierda se han añadido nuevos bits con valor 0. Algunos de estos nuevos bits deben establecerse a 1. El OR bit a bit resulta útil para establecer ciertos bits a 1 y conservar el resto.

Implementa el método Secrets.set_bits, que recibe dos valores y realiza una operación OR bit a bit.

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

4. Deshacer el XOR

Parte del proceso de cifrado aplica un XOR con un valor acordado. Para recuperar el valor original, basta con volver a aplicar el XOR al valor cifrado junto con el valor acordado. Sin embargo, debido a un malentendido, tu amigo invirtió los bits del valor acordado (es decir, aplicó un NOT bit a bit al valor acordado) antes de aplicar el XOR.

Implementa el método Secrets.reverse_xor, que recibe los valores cifrado y acordado y calcula el valor original.

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Crystal Exercism

¿Listo para empezar Secretos?

Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.