Estoy tratando de representar lo que esta declaración de impresión de Java “(((0xFF << (i * 8)) y la prueba))))“significa

griffin3419:

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);
VGR:

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 8
  • maskes de ocho contiguos 1bits de (porque 0xFF es 11111111 en la base de dos), desplazado por un recuento que es un múltiplo de 8
  • resultes la aplicación de la máscara a los 32 bits 11111111111111111111111111111111 (que es la base dos forma de 0xFFFFFFFF, que es el valor de test)

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=318990&siteId=1
Recomendado
Clasificación