2016-07-28 16 views
0
int n; 
    for (n = 0; i >0; n++) 
    { 
     i &= (i-1); 
    } 
    return n; 

// vielleicht seine Funktion ist es, die Anzahl von 1 zu zählen, ich weiß nicht, der Satz bedeutetwas ist das Mittel von i & = (i-1) in Java

+0

doppelte Frage Original hier verweisen: http://Stackoverflow.com/q/1551500/3323444 – krishnakant

+1

Mögliche Duplikat von [Wie funktioniert das Bitwise & (UND) in Java?] (Http://StackOverflow.com/) Fragen/17256644/how-does-the-bitwise-und-Arbeit-in-java) – jonhopkins

+0

@ krishnakant Nein, das ist anders, es ist eine Schleife, es ist nicht nur zu überprüfen, ob es eine Kraft von 2 ist – James

Antwort

2

& is the bitwise AND operation in Java. Was diese Funktion macht gerade die Anzahl der Operationen, die es braucht, um 0 zu erreichen.

Diese Funktion zählt die Anzahl der "1en" in einer binären Darstellung einer Zahl (ein wenig Forschung erlaubt mir zu finden this). Die Art, wie dies funktioniert, ist das Umkehren des Bits ganz rechts, das bei jedem Durchgang in der Schleife 1 ist, bis die Zahl Null ist.

Zum Beispiel, wenn wir diese Funktion auf 100 laufen:

1100100 & 1100011 = 1100000 //Flipped the rightmost one bit (100 & 99) 
1100000 & 1011111 = 1000000 //Then the next (96 & 95) 
1000000 & 0111111 = 0000000 //And finally the last (64 & 63) 

So wird die Schleife 3 Mal ausgeführt haben, was darauf hindeutet 3 "auf" Bits in der Zahl 100.

+0

Aber es beantwortet die Frage wie geschrieben. Vielleicht ist die Antwort unvollständig, aber bisher ist es nicht falsch. – GhostCat

2

Diese in der Tat zählt die Anzahl der Ein-Bits im Wert von i. Es funktioniert jedoch nur für positive Werte. Die JRE bietet Integer.bitCount (i) tut das gleiche und es funktioniert in konstanter Zeit sowie für negative Werte.

Wie es funktioniert, ist es schwer zu verstehen, wenn Sie nicht mit Binärarithmetik vertraut sind. Was grundsätzlich passiert, dass in jeder Schleife das niedrigstwertige gesetzte Bit aufhört und die Schleife stoppt, wenn alle Bits aufgehoben worden sind.

Es funktioniert nicht richtig mit negativen Werten, weil die Schleifenbedingung schlecht gewählt wurde. Es sollte i! = 0 statt i> 0 sein, dann funktioniert es auch mit negativen Werten.

Verwandte Themen