Mi tarea es averiguar lo que este programa Java escrito por mi maestro está haciendo, sin ejecutarlo. He adjuntado todo el programa (corto) y en negrita la expresión que no entiendo. Es aparte del primer bucle, las cuales yo también estoy un poco confuso en cuanto a lo que hace.
import java.util.*;
int intSize = Integer.SIZE / 8; char storage[] = new char[intSize]; int test = 0xffffffff,
test2 = 0;
System.out.println(String.format("0x%08x",0xFF << (3 * 8) & test));
storage[0] = (char) ((0xF << 4));
for (int i = intSize - 1 ; i > -1 ; i--)
// storage[i] = (char) ((0xFF << (i * 8)) & test);
System.out.println(String.format("0x%08x",**(((0xFF << (i * 8)) & test))));**
for (int i = 0, j = intSize-1; i < intSize ; i++, j--)
test2 &= (((int) storage[i]) << (j * 8));
System.out.println(“The Magic Word of the Day is the English word for: ”+test2);
Una forma útil de analizar qué código está haciendo, es dividirlo en los pasos más pequeños posibles.
En primer lugar, hay paréntesis adicionales que no son necesarios. Así que vamos a limpiar eso, cambiando esto:
(((0xFF << (i * 8)) & test))
a este, que es exactamente lo mismo:
(0xFF << (i * 8)) & test
Ahora, imagina que descompone en etapas separadas:
int value = i * 8;
int mask = 0xFF << value;
int result = mask & test;
Por lo tanto, usted sabe que:
value
es un múltiplo de 8mask
es de ocho contiguos1
bits de (porque 0xFF es 11111111 en la base de dos), desplazado por un recuento que es un múltiplo de 8result
es la aplicación de la máscara a los 32 bits 11111111111111111111111111111111 (que es la base dos forma de 0xFFFFFFFF, que es el valor detest
)
Con suerte, si se te ha dado esta asignación, ya entender el propósito del bit a bit &
operador: 1 bit cada uno de los cotos de operando el bit correspondiente en el otro operando, mientras bits 0 en cualquiera de los operandos se borran siempre en el resultado .
Hay muchas cosas en este código, que son una mala práctica. No es un reto, simplemente malo. Te han dado una misión, que es mucho más difícil de lo que debería ser, en mi opinión, con el propósito de demostrar el conocimiento de los operadores matemáticos y bit a bit de Java.