Segreti

Segreti

Esercizio di apprendimento

Introduzione

Crystal ha operatori bitwise per manipolare Int a livello binario.

Operatori di shift

Crystal ha operatori di shift per spostare i bit verso sinistra (<<) o verso destra (>>).

Shift a sinistra (<<)

L'operatore di shift a sinistra (<<) sposta i bit verso sinistra. Il valore da spostare è specificato a sinistra e il numero di posizioni di cui spostarlo è a destra.

0b0010 << 1
# => 0b0100

0b0010 << 2
# => 0b1000

Se il numero è negativo, lo spostamento avverrà invece verso destra.

0b0010 << -1
# => 0b0001

Shift a destra (>>)

L'operatore di shift a destra (>>) sposta i bit verso destra. Come per l'operatore di shift a sinistra, il valore da spostare è specificato a sinistra e il numero di posizioni di cui spostarlo è a destra.

0b0100 >> 1
# => 0b0010

0b0100 >> 2
# => 0b0001

Ed analogamente, l'operatore sposterà verso sinistra se il numero è negativo.

0b0100 >> -1
# => 0b1000

Operatori binari

Crystal ha 3 operatori binari (&, |, ^) ed un operatore ~ per eseguire operazioni bitwise.

AND bitwise (&)

L'operatore binario AND (&) esegue un AND bitwise su due valori. Confronta ogni bit del primo valore con il bit nella stessa posizione del secondo valore. Il bit risultante è impostato a 1 se entrambi i bit sono 1. Altrimenti, è impostato a 0.

0b0011 & 0b1010
# => 0b0010

OR bitwise (|)

L'operatore binario OR (|) esegue un OR bitwise su due valori. Anche in questo caso, confronta ogni bit del primo valore con il bit nella stessa posizione del secondo valore. Se almeno uno dei due bit è 1, il bit risultante è impostato a 1. Altrimenti, è impostato a 0.

0b0011 | 0b1010
# => 0b1011

XOR bitwise (^)

L'operatore binario XOR (^) esegue un XOR bitwise. Come gli operatori AND e OR bitwise, confronta ogni bit del primo valore con il bit nella stessa posizione del secondo valore. Se solo uno dei due è 1, il bit risultante è 1. Altrimenti, è 0.

0b0011 ^ 0b1010
# => 0b1001

NOT bitwise (~)

Infine, l'operatore NOT bitwise (~) inverte ciascun bit del valore. A differenza degli altri operatori binari, questo è un operatore unario, che opera solo sul valore a destra.

~0b1110_0010
# => 0b0001_1101

Istruzioni

Il tuo amico ti ha appena inviato un messaggio con un importante segreto. Non volendo renderlo facile da leggere agli altri, il messaggio è stato cifrato usando una serie di manipolazioni a livello di bit. Dovrai scrivere un programma che ti aiuti a decifrare il messaggio.

1. Sposta i bit indietro

Il primo passo per decifrare il messaggio è annullare lo scorrimento fatto durante la cifratura, spostando i bit di nuovo verso sinistra. Il numero di posizioni di cui spostarli può variare da un messaggio all'altro.

Implementa il metodo Secrets.shift_back, che prende un valore e il numero di posizioni di cui spostarlo verso sinistra.

Secrets.shift_back(0b0001, 2)
# => 0b0100

2. Applica una maschera di bit

Il passo successivo è applicare una maschera di bit per estrarre il valore di alcuni bit. La maschera si applica eseguendo un AND bit a bit tra il valore e la maschera.

Implementa il metodo Secrets.apply_mask, che prende un valore e gli applica una maschera.

Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100

3. Imposta alcuni bit

Lo scorrimento dei bit verso sinistra ha aggiunto dei nuovi bit a 0. Alcuni di questi nuovi bit devono essere impostati a 1. L'OR bit a bit è utile per impostare alcuni bit a 1 preservando tutti gli altri.

Implementa il metodo Secrets.set_bits, che prende due valori ed esegue un OR bit a bit.

Secrets.set_bits(0b0110, 0b0101)
# => 0b111

4. Inverti lo XOR

Una parte del processo di cifratura applica uno XOR con un valore concordato. Per risalire al valore originale, basta applicare di nuovo lo XOR tra il valore cifrato e il valore concordato. Tuttavia, per un malinteso, il tuo amico ha invertito i bit del valore concordato (cioè ha applicato un NOT bit a bit al valore concordato) prima di applicare lo XOR.

Implementa il metodo Secrets.reverse_xor, che prende il valore cifrato e il valore concordato e calcola il valore originale.

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Crystal Exercism

Vuoi iniziare Segreti?

Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.