Crystal tiene operadores a nivel de bits para manipular Int en el plano binario.
Crystal tiene operadores de desplazamiento para desplazar bits a la izquierda (<<) o a la derecha (>>).
<<)El operador de desplazamiento a la izquierda (<<) desplaza los bits hacia la izquierda.
El valor que se va a desplazar se indica del lado izquierdo, y el número de posiciones que se va a desplazar, del lado derecho.
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
Si el número es negativo, se desplazará hacia la derecha en su lugar.
0b0010 << -1
# => 0b0001
>>)El operador de desplazamiento a la derecha (>>) desplaza los bits hacia la derecha.
Al igual que el operador de desplazamiento a la izquierda, el valor que se va a desplazar se indica a la izquierda, y el número de posiciones que se va a desplazar, a la derecha.
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
Y, de forma similar, el operador desplazará hacia la izquierda si el número es negativo.
0b0100 >> -1
# => 0b1000
Crystal tiene 3 operadores binarios (&, |, ^) y un operador ~ para realizar operaciones a nivel de bits.
&)El operador AND binario (&) realiza una operación AND a nivel de bits sobre dos valores.
Compara cada bit del primer valor con el bit que está en la misma posición del segundo valor.
El bit resultante se establece en 1 si ambos bits son 1.
De lo contrario, se establece en 0.
0b0011 & 0b1010
# => 0b0010
|)El operador OR binario (|) realiza una operación OR a nivel de bits sobre dos valores.
También compara cada bit del primer valor con el bit que está en la misma posición del segundo valor.
Si cualquiera de los dos bits es 1, el bit resultante se establece en 1.
De lo contrario, se establece en 0.
0b0011 | 0b1010
# => 0b1011
^)El operador XOR binario (^) realiza una operación XOR a nivel de bits.
Al igual que los operadores AND y OR a nivel de bits, compara cada bit del primer valor con el bit que está en la misma posición del segundo valor.
Si solo uno de ellos es 1, el bit resultante es 1.
De lo contrario, es 0.
0b0011 ^ 0b1010
# => 0b1001
~)Por último, el operador NOT a nivel de bits (~) invierte cada uno de los bits del valor.
A diferencia de los otros operadores binarios, este es un operador unario, que opera solo sobre el valor de la derecha.
~0b1110_0010
# => 0b0001_1101
Tu amigo acaba de enviarte un mensaje con un secreto importante. Como no quería que fuera fácil para otras personas leerlo, el mensaje fue cifrado usando una serie de manipulaciones de bits. Vas a tener que escribir un programa que te ayude a descifrar el mensaje.
El primer paso para descifrar el mensaje es revertir el desplazamiento del proceso de cifrado desplazando los bits de vuelta hacia la izquierda. La cantidad de posiciones que hay que desplazar puede variar entre mensajes.
Implementa el método Secrets.shift_back, que recibe un valor y la cantidad de posiciones que hay que desplazar a la izquierda.
Secrets.shift_back(0b0001, 2)
# => 0b0100
El siguiente paso es aplicar una máscara de bits para extraer el valor de ciertos bits. La máscara se aplica realizando un AND bit a bit entre el valor y la máscara.
Implementa el método Secrets.apply_mask, que recibe un valor y le aplica una máscara.
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
Desplazar bits a la izquierda agregó algunos bits nuevos en 0. Algunos de esos bits nuevos deben establecerse en 1. El OR bit a bit es útil para establecer ciertos bits en 1 mientras se conservan los demás.
Implementa el método Secrets.set_bits, que recibe dos valores y realiza un OR bit a bit.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Parte del proceso de cifrado aplica un XOR con un valor acordado. Para volver al valor original, basta con aplicar XOR de nuevo al valor cifrado con el valor acordado. Sin embargo, debido a un malentendido, tu amigo invirtió los bits del valor acordado (es decir, aplicó un NOT bit a bit al valor acordado) antes de aplicar el XOR.
Implementa el método Secrets.reverse_xor, que recibe el valor cifrado y el valor acordado, y calcula el valor original.
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.