Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Operaciones bit a bit

Las operaciones bit a bit nos permiten manipular dígitos individuales dentro de números binarios.

Elm ofrece varios operadores bit a bit en su módulo Bitwise

Operaciones básicas

Modificar bits individuales de un número se llama enmascaramiento. Una máscara es un número en el que ciertos bits se han establecido de una forma particular para manipular otro número con operadores bit a bit como and, or y xor.

and

and combina dos números quedándose solo con los bits que son 1 en ambos. Esto es útil para comprobar si un bit individual está establecido. Por ejemplo, para comprobar si el cuarto bit de un número está establecido en 1, aplícale and con una máscara de 01000 (8 en decimal) y observa si el resultado es distinto de cero:

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

or combina dos números estableciendo cada bit en 1 si es 1 en uno de los dos números o en ambos. Esto es útil para establecer un bit específico en 1. Por ejemplo, para establecer el segundo bit en 10101, aplícale or con la máscara 00010:

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

xor combina dos números estableciendo cada bit en 1 si es 1 en uno de los números pero 0 en el otro. Esto es útil para invertir un bit a su valor opuesto:

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

complement invierte cada bit de un número (0 se convierte en 1, 1 se convierte en 0).

Ten en cuenta que esto hará que los números positivos se vuelvan negativos y los negativos se vuelvan positivos. Esto se debe a que los números negativos en binario se representan con 1 en la posición más a la izquierda.

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

Los siguientes operadores mueven bits a la izquierda o a la derecha una cantidad determinada de posiciones, lo que en la práctica multiplica o divide por potencias de 2.

shiftLeftBy mueve bits a la izquierda, rellenando con 0 desde el lado derecho. Por ejemplo, para desplazar 21 tres lugares a la izquierda:

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

Esto es lo mismo que decir 21 * 2^3 = 21 * 2 * 2 * 2 = 168

shiftRightBy: mueve bits a la derecha:

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

Desplazar a la derecha dos lugares es lo mismo que hacer una división entera entre 4.

Ten en cuenta que esta función duplica el valor que esté en el bit más a la izquierda. Por eso, los números negativos seguirán siendo negativos:

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

Si quieres desplazar a la derecha y rellenar con ceros, usa shiftRightZfBy:

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

Instrucciones

Tu amigo acaba de enviarte un mensaje con un secreto importante. Como no quería que otros pudieran leerlo con facilidad, el mensaje se cifró realizando una serie de manipulaciones de bits. Vas a tener que escribir las funciones que ayuden a descifrar el mensaje.

1. Desplaza los bits hacia atrás

El primer paso para descifrar el mensaje es deshacer el desplazamiento del proceso de cifrado desplazando los bits de nuevo hacia la derecha. Habrá más pasos en el proceso de descifrado que suponen que se insertan 0s desde el lado izquierdo.

Implementa la función shiftBack, que recibe un número de posiciones a desplazar y un valor, y realiza el desplazamiento.

shiftBack 2 42 --> 10

2. Establece algunos bits

Luego hay algunos bits que hay que establecer a 1.

Implementa la función setBits, que recibe una máscara y un valor, y devuelve el resultado de establecer a 1 los bits del valor. Un bit del valor debe establecerse a 1 cuando el bit correspondiente de la máscara también sea 1. Todos los demás bits deben mantenerse sin cambios.

setBits 66 212 --> 64

3. Invierte bits específicos

Algunos bits se invierten durante el cifrado. Habrá que invertirlos de nuevo para descifrar el mensaje.

Implementa la función flipBits, que recibe una máscara y un valor. La máscara indica qué bits del valor hay que invertir. Si el bit es 1 en la máscara, el bit se invierte en el valor. Todos los demás bits se mantienen sin cambios.

flipBits 23 157 --> 138

4. Borra bits específicos

También hay ciertos bits que siempre se descifran a 0.

Implementa la función clearBits, que recibe una máscara y un valor. Los bits del value deben establecerse a 0 donde el bit de la máscara sea 1. Todos los demás bits deben mantenerse sin cambios.

clearBits 2 15 --> 13

5. Descifra un mensaje

Ahora que ya tienes todas las funciones que necesitas, puedes decodificar el mensaje de tu amigo. Implementa la función decrypt, que realiza las siguientes operaciones:

  1. Establece los bits del año en que nació tu amigo (1996)
  2. Invierte el resultado con el año en que se conocieron (2009)
  3. Desplaza los bits hacia atrás según el número de clases que toman juntos (5)
  4. Borra el primer y el quinto bit.
decrypt 380182 --> 11840

Implementa decrypt con todas las funciones que implementaste en las tareas anteriores.

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elm Exercism

¿Todo listo para empezar Secretos?

Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.