Hier ein Codeschnippsel zum Zählen der gesetzten Bits in einer Eingabe:
for (count = 0; input != 0; ++count)
input &= input - 1;
Der Kniff besteht in der Art und Weise, wie input - 1
gebildet wird. Bei der
Eingabe muss man zwei Fälle unterscheiden:
- Wenn die Eingabe ungerade ist, sprich das niederwertigste Bit ist gesetzt,
dann ist bei
input - 1
gerade das niederwertigste Bit nicht gesetzt und die Und-Verknüpfung beider Zahlen entfernt aus input ein gesetztes Bit. - Wenn die Eingabe gerade ist, ist mindestens das niederwertigste Bit nicht gesetzt und die Eingabe lässt sich in einem Teil bis zum ersten gesetzten Bit 2^n und einen führenden Rest a*2^(n+1) zerlegen: input = a*2^(n+1) + 2^n. Die Subtraktion ergibt 2^n - 1 bei dem das höhstwertige Bit nicht gesetzt ist, aber alle anderen. Somit wird bei der Und-Verknüpfung wird ein gesetztes Bit entfernt.
Dies wird wiederholt, bis alle Bits auf diese Weise entfernt wurden. Da bei der Subtraktion immer ein gesetztes Bit entfernt wird, benötigt die Schleife genau so viele Durchläufe, wie Bits in der Eingabe gesetzt sind.