Полезный способ проанализировать, что делает код, состоит в том, чтобы разбить его на наименьшие возможные шаги.
Во-первых, есть дополнительные скобки, которые не нужны. Итак, давайте исправим это, изменив это:
(((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.