Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Crystal tiene operadores a nivel de bits para manipular Int en el plano 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 se va a desplazar se indica del lado izquierdo, y el número de posiciones que se va a desplazar, del lado derecho.

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 se va a desplazar se indica a la izquierda, y el número de posiciones que se va a 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 a nivel de bits.

AND a nivel de bits (&)

El operador AND binario (&) realiza una operación AND a nivel de bits sobre dos valores. Compara cada bit del primer valor con el bit que está en la misma posición del segundo valor. El bit resultante se establece en 1 si ambos bits son 1. De lo contrario, se establece en 0.

0b0011 & 0b1010
# => 0b0010

OR a nivel de bits (|)

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

0b0011 | 0b1010
# => 0b1011

XOR a nivel de bits (^)

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

0b0011 ^ 0b1010
# => 0b1001

NOT a nivel de bits (~)

Por último, el operador NOT a nivel de bits (~) invierte cada uno de los bits del valor. A diferencia de los otros 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 fuera fácil para otras personas leerlo, el mensaje fue cifrado usando una serie de manipulaciones de bits. Vas a tener que escribir un programa que te ayude a descifrar el mensaje.

1. Desplaza los bits de vuelta

El primer paso para descifrar el mensaje es revertir el desplazamiento del proceso de cifrado desplazando los bits de vuelta hacia la izquierda. La cantidad de posiciones que hay que desplazar puede variar entre mensajes.

Implementa el método Secrets.shift_back, que recibe un valor y la cantidad 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 ciertos bits. La máscara se aplica realizando un 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

Desplazar bits a la izquierda agregó algunos bits nuevos en 0. Algunos de esos bits nuevos deben establecerse en 1. El OR bit a bit es útil para establecer ciertos bits en 1 mientras se conservan los demás.

Implementa el método Secrets.set_bits, que recibe dos valores y realiza un OR bit a bit.

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

4. Invierte el XOR

Parte del proceso de cifrado aplica un XOR con un valor acordado. Para volver al valor original, basta con aplicar XOR de nuevo al valor cifrado 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 el valor cifrado y el valor acordado, y calcula el valor original.

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

¿Todo listo para empezar Secretos?

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