J'ai des zones de mémoire qui pourraient être considérées comme "gamme de bits". Ils sont équivalents à mais il serait préférable de penser comme p> J'accède aux bits séparés de celui-ci avec P > #define GETBIT(x,in) ((in)[ ((x)/8) ] & 1<<(7-((x)%8)))
8 Réponses :
Si vous inverserez l'ordre de bits dans 'Array', vous pouvez éliminer la soustraction de la macro. C'est le meilleur ce que je peux dire, sans connaissance du contexte problématique (comment les bits sont utilisés). P>
Pourquoi ne pas créer votre propre classe wrapper?
Vous pouvez ensuite ajouter des bits au "tableau" à l'aide d'un opérateur tel que + et récupérer les bits individuels à l'aide de [] opérateur. P>
Votre Macro pourrait être amélioré en utilisant et 7 à la place de% 8, mais il est probable que le compilateur rendra cette optimisation pour vous de toute façon. P>
J'ai récemment fait exactement ce que vous faites et que mon flux pourrait consister à tout nombre de bits . P>
J'ai donc quelque chose comme ce qui suit: p> et ainsi de suite. Il crée un bon code lisible et vous pouvez fournir une interface STL comme pour aider la faimilarity :) p> p>
Je ne pense pas. En fait, de nombreuses architectures de la CPU n'accumulent pas les bits individuellement. P>
sur c ++, vous avez BTW, il peut être préférable de regrouper votre tableau de bit comme std :: bitset
mais peut ne pas avoir la plus haute performance en fonction de la mise en œuvre et de l'optimisation de votre compilateur. del> p>
uint32_t [32] code> (ou
uint64_t [16] code>) pour la déséroférance alignée (quel
bitset code> cela pour vous déjà). P>
Pourquoi pensez-vous que std :: bitset
Char [] code> car il peut éliminer les problèmes d'aliasing.
+1 à Msalters Commentaire - STD :: Bitset - avec optimisations activées - ne doit pas être différente de la macro, seules moins de chances d'erreurs. Le code de style stl peut être notamment plus lent dans les constructions de débogage, si vous remarquez des variations de microsecondes.
+1 Ceci est la bonne réponse, bien que je ne sais pas pourquoi l'affiche croit bitset code> serait plus lent que de vous déplacer le vôtre;
bitset code> est très optimisé sur la plupart des systèmes
Pour accéder au hasard pour accéder aux bits individuels, la macro que vous avez suggérée est aussi bonne que vous allez obtenir (tant que vous allumez des optimisations dans votre compilateur).
S'il y a un motif du tout à la Les bits que vous accédez, vous pourrez peut-être faire mieux. Par exemple, si vous accédez souvent à paires em> de bits, vous pouvez voir une certaine amélioration en fournissant une méthode pour obtenir deux bits au lieu d'un, même si vous ne finissez pas toujours avec les deux bits. < / P> Comme avec tout problème d'optimisation, vous devrez être très familier avec le comportement de votre code, en particulier ses modèles d'accès dans votre réseau de bit, pour apporter une amélioration significative de la performance. P> Ces macros clipseraient quatre bits de chaque position de bit 0, 1, 2, etc. . (Pour réduire la prolifération des parenthèses inutiles, vous pouvez utiliser des fonctions inline pour ce qui précède.) Définissez ensuite une fonction inline comme: p> puisque c'est Beaucoup de code fastidieux chaudron, surtout si vous avez plusieurs largeurs différentes, vous pouvez écrire un programme pour générer toutes les fonctions (i remarquez que les bits de vos octets sont stockés dans l'ordre inverse de ce que j'ai écrit ci-dessus. Appliquez une transformation appropriée pour correspondre à votre structure si vous en avez besoin.) P> P> getbet _ * code> accessor. p>
J'ai souvent accès à des bits, en commençant par un alignement aligné aléatoire sans mot m i> et finissant par un autre aléatoire n i>.
Excellent, c'est une excellente opportunité. Je vais ajouter plus à ma réponse.
À ce stade, vous voudrez que des modèles soient honnêtes. Voir ma réponse.
Alors que KennyTM et Msalters ont fourni de très bonnes réponses qui seraient la "bonne chose à faire" si je roulais tout le système par moi-même, je dois travailler avec les données qui arrivent de sources externes ou en étant préparés dans un format "brut" spécifique Pour être envoyé, et std :: bitset
bit [N] code> La disposition de la mémoire de données ne peut pas être évitée.
Étant donné que la question est étiquetée avec C ++, y a-t-il une raison pour laquelle vous ne pouvez pas simplement utiliser la standard Bitset ? P>
Seulement s'il est possible de l'affecter sur une zone de mémoire prédéfinie. Un point important est un bitmap généré par la bibliothèque pour un écran. Aussi - c'est mieux performance-sage? (Dispositif embarqué, ressources limitées, courtes sur les performances déjà)
@SF: Vous pourrez peut-être utiliser STD :: Bitset avec un allocator personnalisé qui utilise vos tableaux de bits mappés en mémoire.
#define GETBIT(x,in) ((in)[ ((x) >>> 3) ] & 1<<((x) & 7))
J'aime ((x) & 7) code> au lieu de
((x)% 8) code> mais je m'attendrais à ce que le compilateur utilise de toute façon cette optimisation. Sont les crochets droit dans
#define getbit (x, in) (((((((x) >>> 3)] & 1 << (x) et 7)) code> être
#define getbit (x, in) ((in) [((x) >>> 3) & 1 << (x) et 7))] code>
Ne relâchez jamais les optimisations Le compilateur peut faire ou non. Si vous pouvez l'optimiser, faites-le, sinon le laisser pour le compilateur qui pourrait ou ne pas être capable de l'optimiser.
Prendre la solution de Greg comme base: peut obtenir au moins 32 bits, même s'ils ne sont pas alignés. Notez que c'est intentionnellement en ligne code> car vous ne voulez pas avoir de tonnes de ces fonctions. p> p>
Au lieu du tableau de caractères et de macros personnalisés non signé, vous pouvez utiliser std :: vecteur
vecteur
dynamic_bitset code> ( Si la taille est déterminée à la compilée, juste
std :: bitset code> pourrait être plus approprié).