Crystal dispose d'opérateurs bit à bit pour manipuler Int au niveau binaire.
Crystal dispose d'opérateurs de décalage pour décaler les bits vers la gauche (<<) ou vers la droite (>>).
<<)L'opérateur de décalage à gauche (<<) décale les bits vers la gauche.
La valeur à décaler est indiquée à gauche et le nombre de positions de décalage à droite.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
Si le nombre est négatif, le décalage se fait vers la droite à la place.
0b0010 << -1
# => 0b0001
>>)L'opérateur de décalage à droite (>>) décale les bits vers la droite.
Comme pour l'opérateur de décalage à gauche, la valeur à décaler est indiquée à gauche et le nombre de positions de décalage à droite.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
Et de la même manière, l'opérateur décale vers la gauche si le nombre est négatif.
0b0100 >> -1
# => 0b1000
Crystal dispose de 3 opérateurs binaires (&, |, ^) et d'un opérateur ~ pour effectuer des opérations bit à bit.
&)L'opérateur ET binaire (&) effectue un ET bit à bit sur deux valeurs.
Il compare chaque bit de la première valeur au bit à la même position dans la seconde valeur.
Le bit résultant vaut 1 si les deux bits valent 1.
Sinon, il vaut 0.
0b0011 & 0b1010
# => 0b0010
|)L'opérateur OU binaire (|) effectue un OU bit à bit sur deux valeurs.
Il compare également chaque bit de la première valeur au bit à la même position dans la seconde valeur.
Si l'un des deux bits vaut 1, le bit résultant vaut 1.
Sinon, il vaut 0.
0b0011 | 0b1010
# => 0b1011
^)L'opérateur OU exclusif binaire (^) effectue un OU exclusif bit à bit.
Comme les opérateurs ET bit à bit et OU bit à bit, il compare chaque bit de la première valeur au bit à la même position dans la seconde valeur.
Si un seul d'entre eux vaut 1, le bit résultant vaut 1.
Sinon, il vaut 0.
0b0011 ^ 0b1010
# => 0b1001
~)Enfin, l'opérateur NON bit à bit (~) inverse chacun des bits de la valeur.
Contrairement aux autres opérateurs binaires, il s'agit d'un opérateur unaire, qui agit uniquement sur la valeur à droite.
~0b1110_0010
# => 0b0001_1101
Ton ami vient de t'envoyer un message contenant un secret important. Pour ne pas rendre sa lecture facile aux autres, le message a été chiffré à l'aide d'une série de manipulations de bits. Tu vas devoir écrire un programme pour t'aider à déchiffrer le message.
La première étape pour déchiffrer le message consiste à annuler le décalage effectué lors du chiffrement en redécalant les bits vers la gauche. Le nombre de positions à décaler peut varier d'un message à l'autre.
Implémente la méthode Secrets.shift_back qui prend une valeur et le nombre de positions à décaler vers la gauche.
Secrets.shift_back(0b0001, 2)
# => 0b0100
L'étape suivante consiste à appliquer un masque de bits pour extraire la valeur de certains bits. Le masque s'applique en effectuant un ET bit à bit entre la valeur et le masque.
Implémente la méthode Secrets.apply_mask qui prend une valeur et lui applique un masque.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
Le décalage des bits vers la gauche a ajouté de nouveaux bits à 0. Certains de ces nouveaux bits doivent être mis à 1. Le OU bit à bit est utile pour mettre certains bits à 1 tout en préservant les autres.
Implémente la méthode Secrets.set_bits qui prend deux valeurs et effectue un OU bit à bit.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Une partie du processus de chiffrement applique un XOR avec une valeur convenue. Pour retrouver la valeur d'origine, il suffit d'appliquer de nouveau le XOR entre la valeur chiffrée et la valeur convenue. Cependant, à cause d'un malentendu, ton ami a inversé les bits de la valeur convenue (c'est-à-dire appliqué un NON bit à bit à la valeur convenue) avant d'appliquer le XOR.
Implémente la méthode Secrets.reverse_xor qui prend la valeur chiffrée et la valeur convenue et calcule la valeur d'origine.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.