2016-12-12 2 views
5

Как записать следующий код в простой для цикла:Как написать прикрепленный блок кода в цикле

int asInt = (valueAsBytes[3] & 0xFF) 
       | ((valueAsBytes[2] & 0xFF) << 8) 
       | ((valueAsBytes[1] & 0xFF) << 16) 
       | ((valueAsBytes[0] & 0xFF) << 24); 
+1

Эран дал правильный ответ, но мне кажется, что я убежден, что я думаю, что я думаю (личное мнение!) Это будет преждевременная оптимизация. Этот код читается, и если он работает, я не понимаю, почему вы захотите заменить его на for-loop. – Fildor

+1

Я просто хотел обобщить –

ответ

5

Обратите внимание, что индекс массива уменьшается на 1 в каждом доступе к valueAsBytes, в то время как второй операнд оператора сдвига увеличивается на 8:

int asInt = 0; 
for (int i = valueAsBytes.length-1; i >= 0; i--) 
    asInt |= valueAsBytes[i] & 0xFF << (valueAsBytes.length-i)*8; 
+0

Спасибо, Эран! –

2

Могу ли я предложить другое решение?

Я думаю, что цикл не добавляет никакой «ясности» к этому коду. Реальная проблема заключается в том, что вы дублируете код типа (valueAsBytes [i] & 0xFF) четыре раза. Если вообще, вы могли бы сделать что-то вроде:

int asInt = maskIndexedValueAndShiftBy(3, 0) | maskIndexedValueAndShiftBy(2, 8) | ... 

с

private final int maskIndexedValueAndShiftBy(int index, int shifter) { 
    return (valueAsBytes[index] & 0xFF) << shifter; 

Цикл просто делает все вычисления труднее понять.