Question

J'aimerais avoir un intérieur de la matrice d'un peu bourré struct. Je sais statiquement la taille du tableau (32), et je voudrais être un seul bit chaque élément du tableau. Par exemple, je voudrais pouvoir dire quelque chose comme:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));

J'ai essayé une ou deux choses, mais gcc ne bougera pas. Il serait agréable de pouvoir le faire pour que je puisse écrire un code propre qui itérer sur les éléments du tableau emballé. Idées?

Était-ce utile?

La solution

Si vous mettez simplement dans un int, alors vous pouvez itérer proprement (32 bits) sur les bits avec une boucle comme ceci:

for (bit = 0; bit < 32; bit++)
    flagValue = ((flags & (1<<bit)) != 0;

Pas beaucoup plus difficile à écrire qu'une syntaxe d'indexation de tableau.

Si vous souhaitez masquer le bit-tripotant pour rendre le code plus lisible, vous pouvez même utiliser une fonction ou une macro pour accéder bits - par exemple GetFlag(bit)

Autres conseils

éléments membres BitField n'ont pas d'adresse, même si vous pouvez déclarer un tableau d'entre eux, il n'y aurait pas moyen de l'utiliser (tous les accès au tableau en C est arithmétique de pointeur et déréférencement). Il est facile de coder votre propre tableau de bits en utilisant les bits d'un type plus grand bien; Jason a expliqué les bases. En général, vous devriez éviter d'utiliser bitfields sauf si vous avez une très bonne raison. Ils sont généralement plus mal que ce qu'ils valent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top