Ich habe this SO question über 32-Bit gelesen, aber was ist mit 64-Bit-Zahlen? Sollte ich nur die oberen und unteren 4 Bytes maskieren, die Zählung auf den 32 Bits durchführen und sie dann zusammenfügen?Anzahl der Bits in einer 64-Bit-Ganzzahl (lang, groß) zählen?
Antwort
Sie 64-Bit-Version http://en.wikipedia.org/wiki/Hamming_weight
finden Sie hier Es ist so etwas wie dieses
static long NumberOfSetBits(long i)
{
i = i - ((i >> 1) & 0x5555555555555555);
i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
return (((i + (i >> 4)) & 0xF0F0F0F0F0F0F0F) * 0x101010101010101) >> 56;
}
Dies ist eine 64-Bit-Version des Codes bilden hier How to count the number of set bits in a 32-bit integer?
Joshua Vorschlag Verwendung Ich würde verwandeln es in das:
static int NumberOfSetBits(ulong i)
{
i = i - ((i >> 1) & 0x5555555555555555UL);
i = (i & 0x3333333333333333UL) + ((i >> 2) & 0x3333333333333333UL);
return (int)(unchecked(((i + (i >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
}
EDIT: Ich habe einen Fehler beim Testen der 32-Bit-Version gefunden. Ich habe fehlende Klammern hinzugefügt. Die Summe sollte
EDIT2 hinzugefügt sicherere Version für Ulong
Eine schnelle (und mehr tragbar als die Verwendung von Nicht-Standard-Compiler-Erweiterungen) Art und Weise:
int bitcout(long long n)
{
int ret=0;
while (n!=0)
{
n&=(n-1);
ret++;
}
return ret;
}
Jedes Mal, wenn Sie ein n&=(n-1)
Sie den letzten Satz Bit in n
beseitigen. Dies benötigt also O (Anzahl der gesetzten Bits) Zeit.
Dies ist schneller als der O (log n), den Sie benötigen würden, wenn Sie jedes Bit getestet haben - nicht jedes Bit ist gesetzt, es sei denn, die Nummer ist 0xFFFFFFFFFFFFFFFF
), daher benötigen Sie normalerweise wesentlich weniger Iterationen.
Standard-Antwort in C#:
ulong val = //whatever
byte count = 0;
while (val != 0) {
if ((val & 0x1) == 0x1) count++;
val >>= 1;
}
Dieses val
ein Bit nach rechts verschiebt, und Schritte count
wenn das Bit ganz rechts eingestellt ist. Dies ist ein allgemeiner Algorithmus, der für Ganzzahlen beliebiger Länge verwendet werden kann.
- 1. Warum ist es nützlich, die Anzahl der Bits zu zählen?
- 2. Anzahl der Bits in Javascript-Nummern
- 3. Anzahl der Bilder in einer Zeichenfolge zählen
- 4. Wie würden Sie die Anzahl der in einer Fließkommazahl gesetzten Bits zählen?
- 5. Anzahl der Zeichenfolgenvorkommen zählen
- 6. zählen die Anzahl der Anrufe einer Klausel
- 7. Vergleich und Zählen Bits blockartig
- 8. x86 - Anzahl der Register vs Anzahl der reservierten Bits
- 9. Zählen der Anzahl der Zeilen in einer Tabelle mit mysql
- 10. Zählen der Anzahl der Zeilen in einer Textdatei
- 11. Zählen der Anzahl der Funktionsaufrufe in einer ausführbaren Datei
- 12. Zählen der Anzahl der Vorkommen jedes Elements in einer Liste
- 13. Zählen der Anzahl der Punkte in einer Zeichenfolge
- 14. Zählen der Anzahl der Zeichen in einer Zeichenfolge
- 15. Zählen der Anzahl der Zeichen in TextBox
- 16. Ist die Anzahl der Bits in einem Byte gleich der Anzahl der Bits in einem Typ-Zeichen?
- 17. Kopieren von Bits von ulong zu lang in C#
- 18. Anzahl der Übereinstimmungen einer Regex in Javascript zählen
- 19. Anzahl der Nachrichten in einer JMS-Warteschlange zählen
- 20. Anzahl der Vorkommen von Wörtern in einer Textdatei zählen
- 21. Python - Anzahl der ganzen Zahlen in einer Zeichenfolge zählen?
- 22. Zählen Sie die Anzahl der Optionen in einer Liste
- 23. Zählen Sie die Anzahl der "Löcher" in einer Bitmap
- 24. zählen Sie die Anzahl der Wörterbücher in einer Zeichenfolge Python
- 25. php/mysql Zählen der Anzahl der Elemente mit einer Bedingung
- 26. Berechnung der Anzahl der in Byte gesetzt Bits
- 27. Wie funktioniert dieser Code, um die Anzahl der 1-Bits zu zählen?
- 28. Anzahl der Kommentare in Artikeln zählen
- 29. Anzahl der vorhandenen Tabs in jquery zählen?
- 30. Anzahl der Personen in meiner Abfrage zählen
vor bitweise &, in der letzten Zeile getan werden soll, lange zu vermeiden verbrannt seine – Joshua
Operationen ohne Vorzeichen sein sollte deaktiviert werden. Ansonsten läuft die Multiplikation in der letzten Zeile sehr leicht über. Aber wenn sie nicht aktiviert sind, denke ich, dass es auch für signiert funktioniert. Selbst wenn die Verschiebung eine arithmetische ist, werden höchstwertige Bits durch eine bitweise & verworfen und die Subtraktion in der ersten Zeile kann still zu dem korrekten Ergebnis überlaufen. –