num &= num - 1;
löscht das niedrigstwertige Bit in num.
Dieser Algorithmus zählt die gesetzten Bits, indem er sie löscht und einen Zähler inkrementiert, bis alle weg sind.
Um zu verstehen, warum es das niedrigstwertige Bit löscht, müssen Sie darüber nachdenken, was die Bits dekrementieren und natürlich verstehen, was die &
Operation tut.
Subtrahieren im Binärformat funktioniert genauso wie der Prozess, in dem wir alle dezimal als Kinder unterrichtet wurden. Sie arbeiten von rechts (am wenigsten signifikant) nach links, subtrahieren einfach einzelne Ziffern, wenn möglich, und "leihen" bei Bedarf von der nächsten Ziffer.
Beim Subtrahieren von 1 von einer Binärzahl, die in einer Menge von Nullen endet, werden durch dieses "Ausleihen" und Subtrahieren alle Nullen in niedrigere Positionen als die ganz rechten 1 zu 1 und die ganz rechte 1 in eine Null umgewandelt).
den &
Operator Dann Anwendung lässt alle die kleineren Ziffern Null, weil sie Null in num
und setzt das am wenigsten signifikante Bit num
auf Null sind, weil es null in num-1
ist.
Beide Operationen lassen die höherwertigen Stellen unverändert.
Hier ist eine gute Liste von bit twiddling hacks einschließlich dieser, die aufgrund Brian Kernighan ist.
Beachten Sie, dass dies auch als Bevölkerungszahl oder Hamming-Gewicht bekannt ist. – delnan
BTW, sollte die if-Klausel geändert werden, um while (num> 0) – Pompair
@Pompair: 'while (num)' ist das gleiche wie 'while (num! = 0)', so ist es richtig. –