Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Manipulación de bits

Java tiene operadores para manipular los bits de un byte, short, int, long o char.

Operadores de desplazamiento

Usa << para desplazar los bits hacia la izquierda y >> para desplazarlos hacia la derecha.

// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100

// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010

El operador << siempre inserta ceros en el lado derecho. Sin embargo, >> inserta el mismo bit que el bit más a la izquierda (1 si el número es negativo o 0 si es positivo).

// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;

// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001

Usa >>> en su lugar cuando se deban insertar ceros al desplazar hacia la derecha.

// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001

Operaciones a nivel de bits

AND a nivel de bits

El operador AND a nivel de bits (&) toma dos valores y realiza una operación AND sobre cada bit. Compara cada bit del primer valor con el bit que está en la misma posición del segundo valor. Si ambos son 1, el bit del resultado es 1. De lo contrario, el bit del resultado es 0.

0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
OR a nivel de bits

El operador OR a nivel de bits (|) toma dos valores y realiza una operación OR sobre cada bit. 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 del resultado es 1. De lo contrario, es 0.

0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
XOR a nivel de bits

El operador XOR a nivel de bits (^) realiza una operación XOR a nivel de bits sobre dos valores. 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.

0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
NOT a nivel de bits (~)

Por último, el operador NOT a nivel de bits (~) invierte cada bit. A diferencia de los operadores anteriores, este es un operador unario, que actúa solo sobre un valor.

~0b0110_0101;
// # => 0b1001_1010

Instrucciones

Tu amigo acaba de enviarte un mensaje con un secreto importante. Como no quería que fuera fácil para otros leerlo, el mensaje se cifró realizando una serie de manipulaciones de bits. Deberás escribir los métodos que ayuden a descifrar el mensaje.

1. Desplaza los bits de vuelta

El primer paso para descifrar el mensaje es deshacer el desplazamiento del proceso de cifrado desplazando los bits de vuelta hacia la derecha. Habrá más pasos en el proceso de descifrado que asumen que se insertan 0s desde el lado izquierdo.

Implementa el método Secrets.shiftBack que recibe un valor y el número de posiciones a desplazar y realiza el desplazamiento.

Secrets.shiftBack(0b1001, 2);
# => 0b0010

2. Establece algunos bits

Ahora, hay algunos bits que hay que establecer en 1.

Implementa el método Secrets.setBits que recibe un valor y una máscara y devuelve el resultado de establecer en 1 los bits del valor. Un bit del valor debe establecerse en 1 donde el bit de la máscara también sea 1. Todos los demás bits deben mantenerse sin cambios.

Secrets.setBits(0b0110, 0b0101);
# => 0b0111

3. Invierte bits específicos

Algunos bits se invierten durante el cifrado. Habrá que invertirlos de vuelta para descifrar el mensaje.

Implementa el método Secrets.flipBits que recibe un valor y la máscara. La máscara indica qué bits del valor hay que invertir. Si el bit es 1 en la máscara, el bit se invierte en el valor. Todos los demás bits se mantienen sin cambios.

Secrets.flipBits(0b1100, 0b0101);
# => 0b1001

4. Borra bits específicos

Por último, también hay ciertos bits que siempre se descifran como 0.

Implementa el método Secrets.clearBits que recibe un valor y una máscara. Los bits del value deben establecerse en 0 donde el bit de la máscara sea 1. Todos los demás bits deben mantenerse sin cambios.

Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Java Exercism

¿Todo listo para empezar Secretos?

Regístrate en Exercism para aprender y dominar Java con 26 conceptos158 ejercicios y mentoría humana real, todo gratis.