calculer le nombre de bits mis en octets
Je suis intéressé, ce qui est la meilleure façon de calculer le nombre de bits dans les octets de cette manière
template< unsigned char byte > class BITS_SET
{
public:
enum {
B0 = (byte & 0x01) ? 1:0,
B1 = (byte & 0x02) ? 1:0,
B2 = (byte & 0x04) ? 1:0,
B3 = (byte & 0x08) ? 1:0,
B4 = (byte & 0x10) ? 1:0,
B5 = (byte & 0x20) ? 1:0,
B6 = (byte & 0x40) ? 1:0,
B7 = (byte & 0x80) ? 1:0
};
public:
enum{RESULT = B0+B1+B2+B3+B4+B5+B6+B7};
};
Peut-être que c'est optimal lorsque la valeur de l'octet est connu au moment de l'exécution? Est-il recommandé d'utiliser ce code?
source d'informationauteur dato datuashvili
Vous devez vous connecter pour publier un commentaire.
8-bit valeurs, il suffit d'utiliser un 256-élément de la table de recherche.
Pour la plus grande taille des entrées, c'est un peu moins trivial. Sean Eron Anderson a plusieurs fonctions pour cela sur son Peu se Tourner les Hacks pageavec toutes les différentes caractéristiques de performance. Il n'est pas un être-tout-fin-tous-version la plus rapide, car il dépend de la nature de votre processeur (pipeline de la profondeur, de la direction générale prédicteur, la taille du cache, etc.) et les données que vous utilisez.
Pour un octet de données, la façon optimale en considérant à la fois la vitesse et la consommation de mémoire:
L'appel de cette fonction à partir d'une boucle for doit produire tout un programme efficace sur la plupart des systèmes. Et il est très générique.
Pourquoi ne pas simplement utiliser la bibliothèque standard? De cette façon, la façon optimale doit être déterminée par la mise en œuvre, et il est probablement mieux que n'importe quel code conforme aux standards que vous pouvez réellement écrire. Par exemple, si vous êtes sur un système x86 cette compile en une seule instruction, mais seulement si vous ciblez des Processeurs qui le prennent en charge.
Pour juste un seul octet de la valeur, de la façon la plus rapide est de stocker la réponse dans un 256 tableau d'octets que vous avez indice de la valeur. Par exemple,
bits_set[] = {0, 1, 1, 2, ...
La réponse habituelle pour le "moyen le plus rapide pour faire bitcount" est "de rechercher les octets dans un tableau". Ce genre de travaux pour les octets, mais vous payez un réel accès à la mémoire.
Si vous ne le faire une fois de temps en temps, il est probablement le plus rapide, mais alors vous n'avez pas besoin de la manière la plus rapide si vous ne le faites qu'une fois de temps en temps.
Si vous le faites, vous êtes mieux de dosage jusqu'octets en mots ou doublewords, et de faire un rapide bitcount les opérations sur ces. Ceux-ci tendent à être de la pure arithmétique, puisque vous ne pouvez pas réaliste de recherche d'une valeur 32 bits dans un tableau pour obtenir son bitcount. Au lieu de cela vous combiner les valeurs de décalage et de masquage de manière astucieuse.
Une grande source de trucs astucieux pour le faire, c'est Peu Hacks.
Ici, c'est le régime qui y sont publiés pour le comptage de bits en 32 bits des mots dans C:
Pourquoi ne pas faire un virage à gauche et masquer le reste?
Cela peut facilement être adapté pour gérer entiers de taille quelconque, simplement en calculant le nombre de bits est dans la valeur étant comptés, puis utiliser cette valeur dans le compteur de la boucle. Tout cela est très trivial à faire.