Le operazioni bit a bit permettono di manipolare le singole cifre all'interno dei numeri binari.
Elm fornisce diversi operatori bit a bit nel suo modulo Bitwise
Modificare i singoli bit di un numero si chiama mascheramento.
Una maschera è un numero in cui bit specifici sono stati impostati in un certo modo per manipolare un altro numero usando operatori bit a bit come and, or e xor.
and combina due numeri mantenendo solo i bit che sono 1 in entrambi.
È utile per verificare se un singolo bit è impostato.
Per esempio, per controllare se il quarto bit di un numero è impostato a 1, esegui l'operazione and con una maschera di 01000 (8 in decimale) e verifica se il risultato è diverso da zero:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
or combina due numeri impostando ogni bit a 1 se è 1 in uno o in entrambi i numeri.
È utile per impostare un bit specifico a 1.
Per esempio, per impostare il secondo bit in 10101, esegui l'operazione or con la maschera 00010:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
xor combina due numeri impostando ogni bit a 1 se è 1 in un numero ma 0 nell'altro.
È utile per invertire un bit nel suo valore opposto:
Bitwise.xor 20 5 --> 17
-- 20 = 10100
-- 5 = 00101
-- xor = 10001 = 17
complement inverte ogni bit di un numero (0 diventa 1, 1 diventa 0).
Nota che questo farà diventare negativi i numeri positivi, ed i numeri negativi positivi.
Questo perché i numeri negativi, in binario, sono rappresentati con 1 nella posizione più a sinistra.
Bitwise.complement 21 --> -22
-- 21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
Gli operatori seguenti spostano i bit a sinistra o a destra di un numero specificato di posizioni, moltiplicando o dividendo di fatto per potenze di 2.
shiftLeftBy sposta i bit a sinistra, riempiendo con 0 dal lato destro.
Per esempio, per spostare 21 a sinistra di 3 posizioni:
Bitwise.shiftLeftBy 3 21 --> 168
-- 21 = 10101
-- shiftLeftBy 3 = 10101000 = 168
Questo equivale a dire 21 * 2^3 = 21 * 2 * 2 * 2 = 168
shiftRightBy: sposta i bit a destra:
Bitwise.shiftRightBy 2 21 --> 5
-- 21 = 10101
-- shiftRightBy 2 = 00101 = 5
Spostare a destra di 2 posizioni equivale alla divisione intera per 4.
Nota che questa funzione duplica il valore che si trova nel bit più a sinistra. Quindi i numeri negativi resteranno negativi:
Bitwise.shiftRightBy 3 -21 --> -3
-- -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3
Se vuoi spostare a destra riempiendo con zeri, usa shiftRightZfBy:
Bitwise.shiftRightZfBy 3 -21 --> 536870909
-- -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909
Il tuo amico ti ha appena inviato un messaggio con un segreto importante. Per non rendere facile agli altri leggerlo, il messaggio è stato cifrato eseguendo una serie di manipolazioni sui bit. Dovrai scrivere le funzioni che ti aiuteranno a decifrare il messaggio.
Il primo passo per decifrare il messaggio è annullare lo scorrimento del processo di cifratura, riportando i bit verso destra.
Ci saranno altri passaggi del processo di decifratura che danno per scontato che gli 0 vengano inseriti dal lato sinistro.
Implementa la funzione shiftBack che riceve un numero di posizioni di scorrimento e un valore, ed esegue lo scorrimento.
shiftBack 2 42 --> 10
Poi ci sono alcuni bit che devono essere impostati a 1.
Implementa la funzione setBits che riceve una maschera e un valore e restituisce il risultato dell'impostazione a 1 dei bit del valore.
Un bit del valore va impostato a 1 quando anche il bit corrispondente nella maschera è 1.
Tutti gli altri bit vanno lasciati invariati.
setBits 66 212 --> 64
Durante la cifratura alcuni bit vengono invertiti. Dovranno essere invertiti di nuovo per decifrare il messaggio.
Implementa la funzione flipBits che riceve una maschera e un valore.
La maschera indica quali bit del valore invertire.
Se un bit è 1 nella maschera, il bit corrispondente viene invertito nel valore.
Tutti gli altri bit vanno lasciati invariati.
flipBits 23 157 --> 138
Ci sono anche alcuni bit che si decifrano sempre a 0.
Implementa la funzione clearBits che riceve una maschera e un valore.
I bit nel value vanno impostati a 0 quando il bit nella maschera è 1.
Tutti gli altri bit vanno lasciati invariati.
clearBits 2 15 --> 13
Ora che hai tutte le funzioni che ti servono, puoi decodificare il messaggio del tuo amico.
Implementa la funzione decrypt che esegue le seguenti operazioni:
decrypt 380182 --> 11840
Implementa decrypt usando tutte le funzioni che hai implementato nelle attività precedenti.
Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.