Brian Kernighans Algorithmus zum Zählen gesetzter Bits in einer Ganzzahl

Google Translate Icon

Zählen Sie bei einer gegebenen Ganzzahl ihre gesetzten Bits.

Zum Beispiel,

Input:  n = -1 (11…1111)
Output: The total number of set bits in -1 is 32
 
Input:  n = 16 (00001000)
Output: The total number of set bits in 16 is 1

Üben Sie dieses Problem

1. Brute-Force-Lösung

Eine einfache Lösung besteht darin, jedes Bit (gesetzt oder nicht gesetzt) in einer Zahl zu berücksichtigen und einen Zähler zu führen, um die gesetzten Bits zu verfolgen. Diese Methode wird unten in C++, Java und Python demonstriert:

C++


Herunterladen  Code ausführen

Ergebnis:

16 in binary is 00010000
The total number of set bits in 16 is 1

Java


Herunterladen  Code ausführen

Ergebnis:

16 in binary is 10000
The total number of set bits in 16 is 1

Python


Herunterladen  Code ausführen

Ergebnis:

16 in binary is 10000
The total number of set bits in 16 (0b10000) is 1

Der obige Brute-Force-Ansatz erfordert eine Iteration pro Bit. Bei einer 32-Bit-Ganzzahl werden also 32 Iterationen durchlaufen.

2. Verwenden des Algorithmus von Brian Kernighan

Wir können den Algorithmus von Brian Kernighan verwenden, um die Leistung des obigen naiven Algorithmus zu verbessern. Die Idee ist, nur die gesetzten Bits einer Ganzzahl zu berücksichtigen, indem das am weitesten rechts stehende gesetzte Bit (nachdem es gezählt wurde) ausgeschaltet wird, sodass die nächste Iteration der Schleife die berücksichtigt nächste rechtes Bit.

Der Ausdruck n & (n-1) kann verwendet werden, um das am weitesten rechts gesetzte Bit einer Zahl auszuschalten n. Dies funktioniert als Ausdruck n-1 dreht alle Bits nach dem am weitesten rechts gesetzten Bit um n, einschließlich des ganz rechts gesetzten Bits selbst. Deswegen, n & (n-1) führt dazu, dass das letzte Bit umgedreht wird n.

Betrachten Sie zum Beispiel die Nummer 52, die ist 00110100 in binär und hat insgesamt 3 Bits gesetzt.

1st iteration of the loop: n = 52
 
00110100    &               (n)
00110011                    (n-1)
~~~~~~~~
00110000
 
 
2nd iteration of the loop: n = 48
 
00110000    &               (n)
00101111                    (n-1)
~~~~~~~~
00100000
 
 
3rd iteration of the loop: n = 32
 
00100000    &               (n)
00011111                    (n-1)
~~~~~~~~
00000000                    (n = 0)

Der Algorithmus kann wie folgt in C++, Java und Python implementiert werden:

C++


Herunterladen  Code ausführen

Ergebnis:

-1 in binary is 11111111111111111111111111111111
The total number of set bits in -1 is 32

Java


Herunterladen  Code ausführen

Ergebnis:

-1 in binary is 11111111111111111111111111111111
The total number of set bits in -1 is 32

Der Algorithmus von Brian Kernighan durchläuft so viele Iterationen, wie es gesetzte Bits gibt. Wenn wir also ein 32-Bit-Wort haben, bei dem nur das High-Bit gesetzt ist, wird es die Schleife nur einmal durchlaufen.

3. Verwenden der integrierten GCC-Funktion

GCC bietet auch eine eingebaute Funktion int __builtin_popcount (unsigned int n) die die Gesamtzahl der gesetzten Bits in zurückgibt n. Das folgende C++-Programm demonstriert es:

C++


Herunterladen  Code ausführen

Ergebnis:

The total number of set bits in 16 is 1

GCC bietet außerdem zwei weitere integrierte Funktionen, int __builtin_popcountl (unsigned long) und int __builtin_popcountll (unsigned long long), ähnlich zu __builtin_popcount, außer dass ihr Argumenttyp ist unsigned long und unsigned long long, beziehungsweise.

4. Verwenden std::bitset::count Funktion

Können wir auch verwenden std::bitset::count die die Gesamtzahl der gesetzten Bits in a zurückgibt bitset. Diese Methode wird im Folgenden demonstriert:

C++


Herunterladen  Code ausführen

Ergebnis:

The total number of set bits in 30 (00011110) is 4

Verweise: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Bewerte diese Nachricht

Durchschnittliche Bewertung 4.92/5. Stimmenzahl: 173

Bisher keine Stimmen! Seien Sie der Erste, der diesen Beitrag bewertet.

Es tut uns leid, dass dieser Beitrag für Sie nicht hilfreich war!

Sagen Sie uns, wie wir diesen Beitrag verbessern können?




Danke fürs Lesen.

Bitte nutzen Sie unsere Online-Compiler um Code in Kommentaren mit C, C++, Java, Python, JavaScript, C#, PHP und vielen weiteren gängigen Programmiersprachen zu posten.

Wie wir? Empfehlen Sie uns Ihren Freunden und helfen Sie uns zu wachsen. Viel Spaß beim Codieren :)



Abonnieren
Benachrichtigen von
guest
7 Kommentare
Am meisten gewählt
Neueste Älteste
Inline-Feedbacks
Alle Kommentare anzeigen
Folgen Sie diesem Link NICHT, sonst werden Sie von der Seite ausgeschlossen!