Heim > Backend-Entwicklung > C++ > Wie kann man gesetzte Bits an einer Position oder darunter in einem Bitsatz effizient zählen?

Wie kann man gesetzte Bits an einer Position oder darunter in einem Bitsatz effizient zählen?

DDD
Freigeben: 2024-12-04 03:10:10
Original
722 Leute haben es durchsucht

How to Efficiently Count Set Bits at a Position or Lower in a Bitset?

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.
  1. Bit-Broadcast:
  2. 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.
  3. Bedingter Popcount:
  4. 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.
  5. Optimales ASM:
  6. Dieser Code erzeugt effizientes x86-ASM auf 64-Bit-Architekturen und nutzt Hardware-Popcount-Anweisungen und Bit-Broadcast Techniken.
  7. 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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage