Я пытаюсь изобразить, что означает это java оператор печати «(((0xFF << (i * 8)) & test))))« - PullRequest
0 голосов
/ 19 марта 2020

Мое задание - выяснить, что делает эта java программа, написанная моим учителем, без ее запуска. Я приложил всю (короткую) программу и выделил жирным шрифтом выражение, которое я не понимаю. Это не относится к числу первых для l oop, и мне также немного неясно, что он делает.

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

1 Ответ

0 голосов
/ 19 марта 2020

Полезный способ проанализировать, что делает код, состоит в том, чтобы разбить его на наименьшие возможные шаги.

Во-первых, есть дополнительные скобки, которые не нужны. Итак, давайте исправим это, изменив это:

(((0xFF << (i * 8)) & test))

на это, что в точности то же самое:

(0xFF << (i * 8)) & test

Теперь представьте, что это разбито на отдельные шаги:

int value = i * 8;
int mask = 0xFF << value;
int result = mask & test;

Итак, вы знаете, что:

  • value кратно 8
  • mask - это восемь смежных 1 бит (потому что 0xFF - это 11111111 в базе два), сдвинутый на число, кратное 8
  • result, представляет собой применение этой маски к 32 битам 11111111111111111111111111111111 (которая является формой двух оснований 0xffffffff, которая является значением из test)

Надеюсь, если вы получили это назначение, вы уже понимаете назначение побитового оператора &: каждый 1-бит в одном операнде сохраняет соответствующий бит в другой операнд, в то время как 0-бит в любом операнде всегда очищается в результате.

В этом коде есть много вещей, которые являются плохой практикой. Не сложно, просто плохо. Вы получили задание, которое, на мой взгляд, намного сложнее, чем должно быть, с целью демонстрации знаний математических и побитовых операторов Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...