Wie zähle ich die Anzahl der null-bits in einem integer?
Wie würde ich gehen über die Suche nach der Anzahl der "null" - bits in C++.
Angenommen ich habe eine integer;
int value = 276;
Für die ich die bits 100010100, aber wie zähle ich die Nullen?
Prüfen Sie hier: graphics.stanford.edu/~seander/bithacks.html
ist, die Hausaufgaben zu machen?
Versuchen Sie, google für "etwas zählen"
Hast du vergessen, über 23 führenden Nullen? Ja, ja, ich weiß, es hängt davon ab, Ganzzahl-Darstellung 😉
Ich verbrachte eine ganze Menge Zeit in die Optimierung
ist, die Hausaufgaben zu machen?
Versuchen Sie, google für "etwas zählen"
Hast du vergessen, über 23 führenden Nullen? Ja, ja, ich weiß, es hängt davon ab, Ganzzahl-Darstellung 😉
Ich verbrachte eine ganze Menge Zeit in die Optimierung
popcount
für Tanimoto Berechnungen vor kurzem; hier ist eine gute Zusammenfassung von mehreren Methoden: dalkescientific.com/writings/diary/archive/2008/07/05/... Endete mit einem 16-bit-LUT, es ist einfach und unwesentlich langsamer als die schnellsten. Das ist, wenn Sie sich sorgen über Geschwindigkeit überhaupt.InformationsquelleAutor | 2010-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfachste, die meisten naive Weg ist das iterieren über die bits und zählen:
Dort sind alle Nummer besser (für verschiedene Werte von "besser") Weise, das ist aber ganz klar, sehr knappe (code-Weise), und nicht ein Haufen von setup.
Einer Mikro-Optimierung, die betrachtet werden könnte, eine Verbesserung ist nicht zu berechnen, die Maske zu testen, jedes bit, statt shift den Wert und testen Sie immer das bit ganz rechts:
Ein weiteres Mikro-Optimierung wäre, um die zu entfernen ==0 (und ändern Sie die Bedingung ein bisschen), da 0==false und 1==true.
aber das ist einfach albern, der compiler, die auf sehr niedrigen Niveaus der Optimierungen (oder vielleicht sogar in keiner). Viel besser zu halten, für Klarheit.
InformationsquelleAutor unwind
Wenn Sie wollen Effizienz, dann ist es eine gute Umsetzung in dem Buch "Hackers Delight"
22 Hinweise Zweig gratis.
Werde ich versuchen zu erklären, wie es funktioniert. Es ist ein divide-und-conquer-Algorithmus.
Verschiebt alle bits 1 Schritt nach rechts und nimmt das am wenigsten signifikante bit von jedem bit-paar.
Also im Grunde haben Sie die folgende Tabelle aller 2-bit-Permutationen.
Dann subtrahieren Sie diese von der nicht verschoben Paaren.
So, jetzt haben wir geändert, alle 2-bit-pair-Mädchen, so dass Ihr Wert jetzt die Anzahl der bits, die von Ihren entsprechenden Ausgangs 2 bit-Paare... und dann werden wir auch weiterhin in ähnlicher Weise mit 4-bit-Gruppen, 8-bit-Gruppen, 16-bit-Gruppen und die letzten 32 bit.
Wenn Sie wollen eine bessere Erklärung, die das Buch kaufen, es gibt eine Menge gute Erklärung und Diskussion alternativer algorithmen etc...
In der Tat. Man hätte tun müssen, um die separate Implementierung für 16,32 und 64 bits. Könnte das mit meta-template-Programmierung.
Auch schön erklärt. Danke
InformationsquelleAutor ronag
Können Sie tun 32 minus die Anzahl der gesetzten bits.
führt den C++ - standard-Mandat eines 8-bit-byte dann? Technisch, in C kann man nicht davon ausgehen, dass sizeof liefert die Größe in 8-bit-bytes.
Du hast Recht. c++ - standard, 1.7-1 sagt, "Ein byte ist zumindest groß genug ist, um jedem Mitglied der basic execution character set und besteht aus einer zusammenhängenden Folge von bits, deren Anzahl wird durch die Implementierung festgelegt."
Yup, Sie müssten
CHAR_BIT * sizeof(int)
- und das auch nur sagt, dass Sie die Größe im Speicher nicht, wie viele bits wirklich benötigt werden für die Wert-Darstellung int. Sie erhalten vonstd::numeric_limits<int>::digits + std::numeric_limits<int>::is_signed
InformationsquelleAutor Goz
Wenn Sie GCC verwenden, können Sie versuchen, built-in-Funktionen:
Sehen GCC-Dokumentation für details.
InformationsquelleAutor mih
Kernighan Weg der Zählung der bits, die
Kann leicht angepasst werden, für die Aufgabe gegeben. Eine Anzahl von Iterationen hier ist gleich einer Anzahl von bits festgelegt.
Ich empfehle auch den link oben für verschiedene andere Möglichkeiten, dies zu lösen und andere Arten von bit-bezogenen Aufgaben. Es gibt auch eine single line Beispiel für den Erhalt bit-count implementiert Makros.
InformationsquelleAutor Basilevs
Bei weitem die naheliegendste Lösung ist eine lookup-Tabelle.
InformationsquelleAutor MSalters
Es ist ein tolles Buch für diese Art von Sachen : Hacker ' s Delight (ja, der name ist beschissen : es hat nichts mit Sicherheit zu tun, sondern ausschließlich bit-twiddling). Es bietet mehrere algorithmen, um count '1' - bits, die besten können auch gefunden werden hier (obwohl das Buch hat Erklärungen, die dieser website nicht).
Sobald Sie wissen, die '1' - bits zählen, nur subtrahieren Sie die Anzahl der bits, die in der Art Ihrer Darstellung.
leider sind die verdammten Medien verdreht die Bedeutung von hack/hacking/hacker in das knacken/Cracken/knacken. Einige von uns immer noch widerstehen, aber.
stimmt zwar, aber jedes mal, empfehle ich dieses Buch bekomme ich dumme Kommentare zur Sicherheit 🙂
InformationsquelleAutor icecrime
Ich bin überrascht, niemand hat erwähnt das man:
Diese geben die Anzahl der null-bits in
num
wenn Sie mit GCC.InformationsquelleAutor 17andLearning
Tun ein Kompliment zählt dann die 1s.
count_zero_bits( x ) = count_one_bits( ~x );
Implementieren Sie den code zum zählen der Einsen.
obwohl es ein Problem mit meiner Funktion, wenn ich eine negative Zahl, weil >> lege 1-bits in der rechten Seite, so erhalten Sie eine nie-terminierende Schleife. Wenn es eine vorgefertigte durchsetzen, einen unsigned-Typ, der wäre ideal.
Sobald Sie das haben, dann:
arbeiten.
InformationsquelleAutor CashCow
Meiner Meinung nach , ist der einfachste Weg, um das null-bit-Zählung in eine positive ganze Zahl ist das folgende Stück code.
Dieses Stück code ist leicht zu verstehen und ist selp explainatory . Dies funktioniert gut für positive ganze zahlen sind.
InformationsquelleAutor user43609
Erweiterung auf ronag Antwort, die von den anderen Nutzern erwähnt habe, führt zu falschen Ergebnissen (seinen Algorithmus funktioniert nur bis zu einem Wert von x = 15), hier ist eine aktualisierte version des Algorithmus:
Die Erklärung der ersten Zeile von ronag ist richtig, jedoch, die restlichen Zeilen werden mit einem anderen Ansatz. In der ersten Zeile, durch die Verschiebung und Subtraktion, jede 2-bit-Paares enthält die Anzahl der bits, die gesetzt wurden, in einem paar in der ursprünglichen Anzahl. Der rest der Zeilen rekursiv Falten Sie diese zahlen zusammen, indem die lsb der einzelnen 2n-bit-Gruppe, um den msb, dass ein paar verschoben von n, so dass die 2n-bit-Gruppe enthält die Anzahl der bits, die gesetzt wurde, in dieser Gruppe in der original-Nummer:
Den oben beschriebenen Algorithmus arbeitet für 32-bit-Ganzzahlen, aber kann leicht angepasst werden durch ändern der Konstanten auf die richtige bit-Länge, so dass das Muster gleich bleibt (z.B. 0x5555... = 0101..., 0x0f0f... = 00001111... usw.) und das hinzufügen/entfernen der entsprechenden Schichten
InformationsquelleAutor milch