Anzahl der Bits zählen: Wie funktioniert diese Linie? n = n & (n-1); [Duplikat]

8

Ich brauche eine Erklärung, wie diese spezielle Linie funktioniert.
Ich weiß, dass diese Funktion die Anzahl der Bits von 1 zählt, aber wie genau löscht diese Zeile das rechte 1 Bit?

%Vor%

Können einige es mir kurz erklären oder einen "Beweis" geben?

    
BBLN 12.03.2013, 19:21
quelle

2 Antworten

15

Jede vorzeichenlose ganze Zahl 'n' hat die folgenden letzten k Ziffern: Eine gefolgt von (k-1) Nullen: 100 ... 0 Beachten Sie, dass k 1 sein kann, in diesem Fall gibt es keine Nullen.

(n - 1) endet in folgendem Format: Null gefolgt von (k-1) 1: 011 ... 1

n & amp; (n-1) wird daher in 'k' Nullen enden: 100 ... 0 & amp; 011 ... 1 = 000 ... 0

Daher n & amp; (n - 1) wird die rechte "1" eliminieren. Bei jeder Iteration wird die rechte 1-Stelle entfernt und Sie können die Anzahl der 1 zählen.

    
user1952500 12.03.2013, 19:28
quelle
3

Ich habe die Bit-Manipulation aufgefrischt und bin auf dieses Problem gestoßen. Es ist vielleicht nicht mehr nützlich für das Original-Poster (3 Jahre später), aber ich werde trotzdem antworten, um die Qualität für andere Zuschauer zu verbessern.

Was bedeutet es, dass n & (n-1) gleich null ist?

Wir sollten sicherstellen, dass wir das wissen, da dies der einzige Weg ist, die Schleife zu unterbrechen ( n != 0 ). Sagen wir n=8 . Die Bit-Repräsentation dafür wäre 00001000 . Die Bitdarstellung für n-1 (oder 7) wäre 00000111 . Der Operator & gibt die in beiden Argumenten gesetzten Bits zurück. Da für 00001000 und 00000111 keine ähnlichen Bits gesetzt sind, wäre das Ergebnis 00000000 (oder Null). Sie haben vielleicht bemerkt, dass die Zahl 8 nicht zufällig gewählt wurde. Es war ein Beispiel, in dem n die Potenz von 2 ist. Alle Potenzen von 2 (2,4,8,16 usw.) haben das gleiche Ergebnis.

Was passiert, wenn Sie etwas übergeben, das kein Exponent von 2 ist? Zum Beispiel, wenn n=6 , ist die Bitdarstellung 00000110 und n-1=5 oder 00000101 .Das & wird auf diese 2 Argumente angewendet und sie haben nur ein einzelnes Bit gemeinsam, das 4 ist. Jetzt, n=4 ist nicht Null, also erhöhen wir c und versuchen denselben Prozess mit n=4 . Wie wir oben gesehen haben, ist 4 ein Exponent von 2, so dass es im nächsten Vergleich die Schleife durchbricht. Es schneidet das Bit ganz rechts ab, bis n gleich einer Potenz von 2 ist.

Was ist c ?

Es wird nur für jede Schleife um eins erhöht und beginnt bei 0. c ist die Anzahl der abgeschnittenen Bits, bevor die Zahl einer Potenz von 2 entspricht.

    
Andrew Campbell 01.04.2016 13:30
quelle

Tags und Links