2016-12-12 44 views
5

Jak napisać następujący kod w prosty dla pętli:Jak napisać dołączony blok kodu w pętli for

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

Eran dał poprawną odpowiedź, ale czuję się wezwana, aby wrzucić to, co myślę (osobiste zdanie!), Że to przedwczesna optymalizacja. Ten kod jest czytelny i jeśli działa, nie widzę powodu, dla którego chciałbyś go zastąpić pętlą for. – Fildor

+1

Po prostu chciałem uogólnić –

Odpowiedz

5

Należy zauważyć, że indeks tablicy zmniejsza o 1 w każdym wejściu do valueAsBytes, podczas drugiego argumentu operatora zmiany wzrasta o 8:

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

Dzięki Eran to działało !! –

2

Czy mogę zaproponować inne rozwiązanie?

Myślę, że pętla nie dodaje żadnej "klarowności" do tego kodu. Prawdziwym problemem jest czterokrotne powielanie kodu jak (valueAsBytes [i] & 0xFF). Jeśli w ogóle, można zrobić coś takiego:

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

z

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

Pętla po prostu sprawia, że ​​cały obliczenia trudniejsze do zrozumienia.