Effizientes Zählen gesetzter Bits an einer Position oder darunter
Problemstellung:
Gegeben a std::bitset<64> Bestimmen Sie mit beliebigen Bitwerten und einer Bitposition X (0-63) die effizienteste Methode zum Zählen von Bits an Position Optimierte Lösung:
Der folgende C-Code generiert einen hochoptimierten x86-ASM, der gesetzte Bits innerhalb eines spezifizierten Bereichs effizient zählt Bereich:
Implementierungsdetails:
#include <bitset>
int popcount_subset(std::bitset<64> bits, int pos) {
int high_bits_to_eliminate = 63 - pos;
bits <<= high_bits_to_eliminate & 63; // Shift to place desired bits at the top
return (bits[63] ? ~0ULL : 0) & bits.count(); // Broadcast high bit or return 0, then popcount
}
Nach dem Login kopieren
Verschiebungsvorgang:
Der Bitsatz wird um 63 - pos nach links verschoben, um ihn auszurichten gewünschten Bits mit dem Anfang eines 64-Bit-Registers. Dadurch werden unerwünschte Bits aus der Zählung entfernt.-
Bit-Broadcast:
Das High-Bit des verschobenen Bitsatzes wird mithilfe einer arithmetischen Rechtsverschiebung an alle Bitpositionen gesendet. Dadurch wird eine Maske erstellt, in der alle Bits gesetzt werden, wenn das High-Bit gesetzt ist (d. h. das Bit an pos ist gesetzt) und ansonsten alle Bits gelöscht sind.-
Bedingter Popcount:
Die UND-Operation kombiniert den Bitsatz mit der Maske. Wenn das Bit an pos gesetzt ist, ist die Maske ~0ULL, was zum ursprünglichen Popcount führt. Andernfalls ist die Maske 0, was zu einem Popcount von 0 führt.-
Optimales ASM:
Dieser Code erzeugt effizientes x86-ASM auf 64-Bit-Architekturen und nutzt Hardware-Popcount-Anweisungen und Bit-Broadcast Techniken. Vorteile:
Effizient zum Zählen gesetzter Bits innerhalb eines bestimmten Bereichs.
Funktioniert für beliebige Bitsatzgrößen von Konstanten entsprechend anpassen.- Generiert hochoptimiertes ASM auf vielen Architekturen, einschließlich x86-64 und ARM64.
- Behandelt Fälle, in denen pos die Bitset-Größe überschreitet, ohne undefiniertes Verhalten.
-
Das obige ist der detaillierte Inhalt vonWie kann man gesetzte Bits an einer Position oder darunter in einem Bitsatz effizient zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!