Les opérations bit à bit permettent de manipuler les chiffres individuels des nombres binaires.
Elm fournit plusieurs opérateurs bit à bit dans son module Bitwise
Modifier individuellement les bits d'un nombre s'appelle le masquage.
Un masque est un nombre dans lequel certains bits ont été définis d'une manière particulière afin de manipuler un autre nombre à l'aide d'opérateurs bit à bit tels que and, or et xor.
and combine deux nombres en ne conservant que les bits qui valent 1 dans les deux.
C'est utile pour vérifier si un bit particulier est défini.
Par exemple, pour vérifier si le 4e bit d'un nombre vaut 1, fais un and avec un masque de 01000 (8 en décimal) et regarde si le résultat est différent de zéro :
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
or combine deux nombres en mettant chaque bit à 1 s'il vaut 1 dans l'un des deux nombres ou dans les deux.
C'est utile pour mettre un bit particulier à 1.
Par exemple, pour mettre le 2e bit de 10101 à 1, fais un or avec le masque 00010 :
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
xor combine deux nombres en mettant chaque bit à 1 s'il vaut 1 dans l'un des nombres mais 0 dans l'autre.
C'est utile pour inverser un bit et lui donner la valeur opposée :
Bitwise.xor 20 5 --> 17
-- 20 = 10100
-- 5 = 00101
-- xor = 10001 = 17
complement inverse chaque bit d'un nombre (0 devient 1, 1 devient 0).
À noter que les nombres positifs deviennent alors négatifs, et les nombres négatifs deviennent positifs.
En effet, en binaire, les nombres négatifs sont représentés par un 1 à la position la plus à gauche.
Bitwise.complement 21 --> -22
-- 21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
Les opérateurs suivants déplacent les bits vers la gauche ou vers la droite d'un nombre donné de positions, ce qui revient à multiplier ou à diviser par des puissances de 2.
shiftLeftBy déplace les bits vers la gauche, en remplissant avec des 0 depuis la droite.
Par exemple, pour décaler 21 de 3 positions vers la gauche :
Bitwise.shiftLeftBy 3 21 --> 168
-- 21 = 10101
-- shiftLeftBy 3 = 10101000 = 168
Cela revient à dire 21 * 2^3 = 21 * 2 * 2 * 2 = 168
shiftRightBy : déplace les bits vers la droite :
Bitwise.shiftRightBy 2 21 --> 5
-- 21 = 10101
-- shiftRightBy 2 = 00101 = 5
Décaler de 2 positions vers la droite revient à une division entière par 4.
À noter que cette fonction duplique la valeur présente dans le bit le plus à gauche. Les nombres négatifs restent donc négatifs :
Bitwise.shiftRightBy 3 -21 --> -3
-- -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3
Si tu veux décaler vers la droite en remplissant avec des zéros, utilise shiftRightZfBy :
Bitwise.shiftRightZfBy 3 -21 --> 536870909
-- -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909
Ton ami vient de t'envoyer un message contenant un secret important. Pour ne pas en faciliter la lecture aux autres, le message a été chiffré au moyen d'une série de manipulations de bits. Tu vas devoir écrire les fonctions qui permettent de déchiffrer le message.
La première étape du déchiffrement consiste à annuler le décalage effectué lors du chiffrement, en décalant les bits vers la droite.
Les étapes suivantes du déchiffrement supposent que des 0 sont insérés par la gauche.
Implémente la fonction shiftBack qui prend un nombre de positions de décalage et une valeur, puis effectue le décalage.
shiftBack 2 42 --> 10
Ensuite, certains bits doivent être mis à 1.
Implémente la fonction setBits qui prend un masque et une valeur, et renvoie le résultat de la mise à 1 des bits de la valeur.
Un bit de la valeur doit être mis à 1 là où le bit correspondant du masque vaut lui aussi 1.
Tous les autres bits doivent rester inchangés.
setBits 66 212 --> 64
Certains bits sont inversés lors du chiffrement. Il faudra les inverser à nouveau pour déchiffrer le message.
Implémente la fonction flipBits qui prend un masque et une valeur.
Le masque indique quels bits de la valeur doivent être inversés.
Si le bit vaut 1 dans le masque, le bit correspondant est inversé dans la valeur.
Tous les autres bits restent inchangés.
flipBits 23 157 --> 138
Il y a aussi des bits qui se déchiffrent toujours en 0.
Implémente la fonction clearBits qui prend un masque et une valeur.
Les bits de value doivent être mis à 0 là où le bit du masque vaut 1.
Tous les autres bits doivent rester inchangés.
clearBits 2 15 --> 13
Maintenant que tu disposes de toutes les fonctions nécessaires, tu peux décoder le message de ton ami.
Implémente la fonction decrypt qui effectue les opérations suivantes :
decrypt 380182 --> 11840
Implémente decrypt à l'aide de toutes les fonctions que tu as implémentées dans les tâches précédentes.
Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.