Puis-je attribuer un nombre de bits en C?

Je suis en train de stocker une grande quantité de booléens de l'information qui est déterminé au moment de l'exécution. Je me demandais quelle est la meilleure méthode pourrait être.

J'ai été essayer d'allouer de la mémoire à l'aide de:

pStatus = malloc((<number of data points>/8) + 1);

en pensant que cela va me donner assez de bits pour travailler avec. Je pourrais alors faire référence à chaque valeur booléenne à l'aide du pointeur dans la notation de tableau:

pStatus[element]

Malheureusement, cela ne semble pas fonctionner très bien. Tout d'abord, j'ai de la difficulté à l'initialisation de la mémoire de la valeur de l'entier 0. Cela peut être fait en utilisant memset()? Pourtant, je ne pense pas que l'impact est pourquoi je plantage lors de l'accès pStatus[element].

Je suis également pas tout à fait convaincu que cette approche est le meilleur à utiliser. Ce que je veux vraiment, c'est essentiellement un géant masque de bits qui reflète l'état de l'valeurs booléennes. Ai-je raté quelque chose?

  • Comment grand est grand? Un million de bits, qui est stocké par octet est à seulement 1 mo de mémoire. Pourquoi perdre son temps avec les bits lorsque octets travail tellement mieux?
  • Je pense que les commentaires sont un peu des citoyens de deuxième classe à l'heure actuelle. Mais, cela devient hors sujet pour cette question 😛
  • Je suis d'accord avec le commentaire ci-dessus. Il va être beaucoup plus simple et plus rapide (à la fois de dev et de l'exécution) de l'utilisation d'un tableau d'octets (unsigned caractères).
  • Je voudrais vous donner le crédit Lott, mais vous n'avez pas de réponse pour moi de vérifier. Merci pour votre suggestion. Il est facile d'oublier que, tandis que 100 000 points de données est beaucoup pour un homme, l'ordinateur ne sont même pas casser une sueur.
  • Plus hors-sujet: "convertissez-commentaire(s) de répondre" peut-être la bonne SI caractéristique.
  • Il serait mieux de ne pas assumer un octet est toujours 8 bits: certaines très anciennes plates-formes avaient 9 bits/octets, et je crois que le VAXes' (et Nintendo64?) le plus petit entier qui est en 32bits. Préférable d'inclure<limites.h>, et l'utilisation de la macro CHAR_BITS qui garantit la bonne quantité de bits par octet, sur chaque plate-forme.
  • Pas tellement pour le Vax. Les caractères de 8 bits. Et de noter que la plupart des implémentations ci-dessous fonctionne très bien avec n'importe quel nombre de bits par octet tant qu'il y a 8 ou plus 🙂
  • Bon. Le Point est: pourquoi sacrifier la portabilité à l'aide d'une valeur codée en dur quand vous pouvez faire la bonne chose, dès le début, à presque zéro coût? Vous n'avez qu'à écrire un peu plus, c'est elle!
  • Vrai. OP utilisé 8 bits, mais en utilisant CHAR_BITs est la bonne Réponse.
  • Ah, trouvé, sur la page Wikipedia de l'Octet de l'article: L'octet le plus souvent constitué de 8 bits dans les systèmes modernes, cependant, la taille d'un octet peut varier et est généralement déterminé par le sous-jacent système d'exploitation d'ordinateur ou de matériel. Historiquement, les octets ont varié de cinq à douze bits. Citation nécessaire?

InformationsquelleAutor Tim | 2008-11-12