Crystal ha operatori bitwise per manipolare Int a livello binario.
Crystal ha operatori di shift per spostare i bit verso sinistra (<<) o verso destra (>>).
<<)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
>>)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
Crystal ha 3 operatori binari (&, |, ^) ed un operatore ~ per eseguire operazioni 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
|)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
^)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
~)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
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.
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
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
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
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)
Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.