Las operaciones bit a bit nos permiten manipular dígitos individuales dentro de números binarios.
Elm proporciona varios operadores bit a bit en su módulo Bitwise
Modificar bits individuales de un número se llama enmascaramiento.
Una máscara es un número en el que se han establecido bits específicos de una forma concreta para manipular otro número usando operadores bit a bit como and, or y xor.
and combina dos números conservando solo 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 a 1, usa and con una máscara de 01000 (8 en decimal) y comprueba si el resultado no es cero:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
or combina dos números estableciendo cada bit a 1 si es 1 en al menos uno de los dos números.
Esto es útil para establecer un bit concreto a 1.
Por ejemplo, para establecer el segundo bit de 10101, usa or con la máscara 00010:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
xor combina dos números estableciendo cada bit a 1 si es 1 en un número pero 0 en el otro.
Esto es útil para cambiar un bit por su valor opuesto:
Bitwise.xor 20 5 --> 17
-- 20 = 10100
-- 5 = 00101
-- xor = 10001 = 17
complement invierte cada bit de un número (0 pasa a 1, 1 pasa a 0).
Ten en cuenta que esto hará que los números positivos pasen a ser negativos, y los negativos, 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
Los siguientes operadores mueven bits a la izquierda o a la derecha un número determinado de posiciones, lo que equivale a multiplicar o dividir por potencias de 2.
shiftLeftBy mueve bits a la izquierda, rellenando con 0 desde el lado derecho.
Por ejemplo, para desplazar 21 a la izquierda 3 posiciones:
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 2 posiciones es lo mismo que una división entera por 4.
Ten en cuenta que esta función repite el valor que haya en el bit más a la izquierda. Así, 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
Tu amigo acaba de enviarte un mensaje con un secreto importante. Como no quería que los demás pudieran leerlo con facilidad, el mensaje se cifró realizando una serie de manipulaciones de bits. Tendrás que escribir las funciones que ayuden a descifrar el mensaje.
El primer paso para descifrar el mensaje consiste en deshacer el desplazamiento del proceso de cifrado desplazando los bits de vuelta a la derecha.
En los pasos posteriores del proceso de descifrado se dará por supuesto que los 0s se insertan por el lado izquierdo.
Implementa la función shiftBack, que recibe un número de posiciones que hay que desplazar y un valor, y realiza el desplazamiento.
shiftBack 2 42 --> 10
A continuación, hay algunos bits que deben ponerse a 1.
Implementa la función setBits, que recibe una máscara y un valor y devuelve el resultado de poner a 1 los bits de value.
Un bit de value debe ponerse a 1 allí donde el bit de la máscara también sea 1.
Todos los demás bits deben permanecer sin cambios.
setBits 66 212 --> 64
Algunos bits se invierten durante el cifrado. Habrá que volver a invertirlos 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 permanecen sin cambios.
flipBits 23 157 --> 138
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 de value deben ponerse a 0 allí donde el bit de la máscara sea 1.
Todos los demás bits deben permanecer sin cambios.
clearBits 2 15 --> 13
Ahora que ya tienes todas las funciones que necesitas, puedes descifrar el mensaje de tu amigo.
Implementa la función decrypt, que realiza las siguientes operaciones:
decrypt 380182 --> 11840
Implementa decrypt con todas las funciones que has implementado en las tareas anteriores.
Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.