Maison > développement back-end > C++ > Comment compter efficacement les bits définis à une position ou inférieure dans un jeu de bits ?

Comment compter efficacement les bits définis à une position ou inférieure dans un jeu de bits ?

DDD
Libérer: 2024-12-04 03:10:10
original
674 Les gens l'ont consulté

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

Comptage efficace des bits réglés à une position ou inférieure

Énoncé du problème :

Étant donné un std::bitset<64> avec des valeurs de bits arbitraires et une position de bit X (0-63), déterminez le moyen le plus efficace de compter les bits à la position X ou inférieure, ou renvoyez 0 si le bit à X n'est pas défini.

Solution optimisée :

Le code C suivant génère un ASM x86 hautement optimisé qui compte efficacement les bits définis dans un délai spécifié. range :

#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
}
Copier après la connexion

Détails de mise en œuvre :

  1. Opération de décalage : Le jeu de bits est décalé vers la gauche de 63 - pos pour aligner le bits souhaités avec le haut d’un registre de 64 bits. Cela élimine les bits indésirables du décompte.
  2. Bit Broadcast : Le bit haut du jeu de bits décalé est diffusé à toutes les positions de bits en utilisant un décalage arithmétique vers la droite. Cela crée un masque où tous les bits sont définis si le bit haut est défini (c'est-à-dire que le bit en pos est défini) et tous les bits sont clairs sinon.
  3. Popcount conditionnel : L'opération AND combine le bitset avec le masque. Si le bit en pos est défini, le masque sera ~ 0ULL, ce qui donnera le popcount d'origine. Sinon, le masque sera 0, ce qui entraînera un popcount de 0.
  4. ASM optimal : Ce code produit un ASM x86 efficace sur des architectures 64 bits, en tirant parti des instructions de popcount matériel et de la diffusion de bits. techniques.

Avantages :

  • Efficace pour compter les bits définis dans une plage spécifiée.
  • Fonctionne pour des tailles de jeu de bits arbitraires en ajustant les constantes en conséquence.
  • Génère un ASM hautement optimisé sur de nombreuses architectures, y compris x86-64 et ARM64.
  • Gère les cas où pos dépasse la taille du jeu de bits sans comportement indéfini.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal