Crystal tiene operadores bit a bit para manipular Int a nivel 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 hay que desplazar se indica a la izquierda y el número de posiciones que hay que desplazar, a la derecha.
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 hay que desplazar se indica a la izquierda y el número de posiciones que hay que 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 bit a bit.
&)El operador AND binario (&) realiza una operación AND bit a bit sobre dos valores.
Compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor.
El bit resultante se pone a 1 si ambos bits son 1.
En caso contrario, se pone a 0.
0b0011 & 0b1010
# => 0b0010
|)El operador OR binario (|) realiza una operación OR bit a bit sobre dos valores.
También compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor.
Si cualquiera de los dos bits es 1, el bit resultante se pone a 1.
En caso contrario, se pone a 0.
0b0011 | 0b1010
# => 0b1011
^)El operador XOR binario (^) realiza una operación XOR bit a bit.
Al igual que los operadores AND y OR bit a bit, compara cada bit del primer valor con el bit que ocupa la misma posición en el segundo valor.
Si solo uno de ellos es 1, el bit resultante es 1.
En caso contrario, es 0.
0b0011 ^ 0b1010
# => 0b1001
~)Por último, el operador NOT bit a bit (~) invierte cada uno de los bits del valor.
A diferencia de los demás 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 a otros les resultara fácil leerlo, el mensaje se ha cifrado mediante una serie de manipulaciones de bits. Tendrás que escribir un programa que te ayude a descifrar el mensaje.
El primer paso para descifrar el mensaje consiste en deshacer el desplazamiento del proceso de cifrado desplazando los bits de nuevo hacia la izquierda. El número de posiciones que hay que desplazar puede variar de un mensaje a otro.
Implementa el método Secrets.shift_back, que recibe un valor y el número 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 determinados bits. La máscara se aplica realizando una operación 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
Al desplazar bits a la izquierda se han añadido nuevos bits con valor 0. Algunos de estos nuevos bits deben establecerse a 1. El OR bit a bit resulta útil para establecer ciertos bits a 1 y conservar el resto.
Implementa el método Secrets.set_bits, que recibe dos valores y realiza una operación OR bit a bit.
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
Parte del proceso de cifrado aplica un XOR con un valor acordado. Para recuperar el valor original, basta con volver a aplicar el XOR al valor cifrado junto 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 los valores cifrado y 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.