Comment mettre en œuvre un bitset en C?
J'ai été en utilisant le Bitset classe en Java et je voudrais faire quelque chose de similaire en C. je suppose que je dois le faire manuellement comme la plupart des choses dans C. Ce serait une manière efficace de mettre en œuvre?
byte bitset[]
peut-être
bool bitset[]
?
Efficace en termes de mémoire ou le PROCESSEUR?
Je suppose qu'en termes de mémoire, en premier lieu. C'est parce que de peu d'possible la charge de traitement, mais grave, les frais généraux en cas de défauts de cache.
il y a une différence? Si il y a un grand nombre de bits, les performances seront liés par les défauts de cache, de sorte que l'emballage les bits d'aussi près que possible de donner de meilleures performances. Seulement si il y a très peu de bits peut-il être plus efficace d'utiliser un ensemble d'octets (ou plus) par bit.
Je suppose qu'en termes de mémoire, en premier lieu. C'est parce que de peu d'possible la charge de traitement, mais grave, les frais généraux en cas de défauts de cache.
il y a une différence? Si il y a un grand nombre de bits, les performances seront liés par les défauts de cache, de sorte que l'emballage les bits d'aussi près que possible de donner de meilleures performances. Seulement si il y a très peu de bits peut-il être plus efficace d'utiliser un ensemble d'octets (ou plus) par bit.
OriginalL'auteur David Robles | 2010-12-07
Vous devez vous connecter pour publier un commentaire.
Le rclc a un bitset mise en œuvre, vous pouvez utiliser: http://ccan.ozlabs.org/info/jbitset.html
Mais si vous finissez par la mise en œuvre elle-même (par exemple si vous n'aimez pas les dépendances sur le paquet), vous devez utiliser un tableau d'entiers et d'utiliser la taille d'origine de l'ordinateur de l'architecture:
Ne pas utiliser une taille spécifique (par exemple, avec uint64 ou uint32), laissez l'utilisation de l'ordinateur ce qu'il souhaite utiliser et adapter pour que l'utilisation de sizeof.
Certainement l'expérience, mais dans mon expérience, à l'aide de la taille de mot de split est généralement plus rapide. Je ne suis pas sûr de comprendre votre premier point?
sizeof
est exprimée en octets, pas de bits. Vous devez multiplier par 8 (ou plus généralementCHAR_BIT
dans certains de ces expressions.doh, merci! 🙂
FYI ccan.ozlabs.org/info/jbitset.html n'existe plus
OriginalL'auteur Mike Axiak
Personne n'a mentionné que le C FAQ recommande, qui est un tas de bon-vieux-macros:
(via http://c-faq.com/misc/bitsets.html)
int i = 0, bits; BITSET(bits, i++)
Vous avez un point, mais il semble assez largement utilisé. Il semble que la bonne façon de mettre en œuvre une macro est de l'appelant comprendre que c'est une macro, mettant ainsi le fardeau de la preuve de l'appelant. (Quelqu'un qui n'aime pas cela, pouvez l'envelopper dans un en ligne)
OriginalL'auteur
Bien, byte bitset[] semble un peu trompeur, non?
Utiliser des champs de bits dans une struct et puis vous pouvez maintenir une collection de ces types (ou les utiliser autrement comme bon vous semble)
Ouais, j'ai pensé que plus tard, et alors remarqué que Mike posté quelque chose le long de ces lignes.
Contre-productif utilisation de bitfields et l'utilisation des index dans les noms de variable.
OriginalL'auteur Ed S.
Je recommande mon BITSCAN de la bibliothèque C++ (version 1.0 vient de sortir). BITSCAN est spécifiquement orienté pour rapide bitscan opérations. Je l'ai utilisé pour mettre en œuvre un problème NP-Difficile combinatoire des problèmes impliquant simple non orienté graphiques, tels que la clique maximale (voir BBMC algorithme, avec une pointe de solveur exact).
Une comparaison entre BITSCAN et des solutions standard STL bitset et de STIMULER dynamic_bitset est disponible ici:
http://blog.biicode.com/bitscan-efficiency-at-glance/
OriginalL'auteur chesslover
Vous pouvez donner à mon PackedArray code essayer avec un
bitsPerItem
de1
.Il met en œuvre un accès aléatoire conteneur, où les articles sont emballés au niveau des bits. En d'autres termes, il agit comme si vous étiez en mesure de manipuler un par exemple
uint9_t
ouuint17_t
tableau:OriginalL'auteur Gregory Pakosz
Comme d'habitude, vous devez d'abord décider quel type d'opérations que vous devez effectuer sur votre bitset. Peut-être qu'un sous-ensemble de ce que Java définit? Après cela, vous pouvez décider de la meilleure façon à la mettre en œuvre. Vous pouvez certainement chercher à la source pour l'BitSet.java dans OpenJDK pour des idées.
OriginalL'auteur James K Polk
Faire un tableau de unsigned int 64.
OriginalL'auteur EvilTeach