Track
/
Elm
Elm
/
Esercizi
/
Segreti
Segreti

Segreti

Esercizio di apprendimento

Introduzione

Operazioni bit a bit

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

Operazioni di base

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

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

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
OR esclusivo (xor)

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
Complemento

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
Scorrimento dei bit

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

Istruzioni

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.

1. Sposta indietro i bit

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

2. Imposta alcuni bit

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

3. Inverti bit specifici

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

4. Azzera bit specifici

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

5. Decifra un messaggio

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:

  1. Imposta i bit a partire dall'anno in cui è nato il tuo amico (1996)
  2. Inverti il risultato con l'anno in cui vi siete conosciuti (2009)
  3. Sposta indietro i bit del numero di lezioni che frequentate insieme (5)
  4. Azzera il primo e il quinto bit.
decrypt 380182 --> 11840

Implementa decrypt usando tutte le funzioni che hai implementato nelle attività precedenti.

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elm Exercism

Vuoi iniziare Segreti?

Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.