Question

J'ai un entier-tenant le drapeau qui a un ensemble existant de drapeaux possibles:

#define MAIL_ADDR_FROM  0x0001  /* address field contains the from address */
#define MAIL_ADDR_TO    0x0002  /* address field contains the to address */
#define MAIL_SEEN       0x0004  /* message has been read by the user */
#define MAIL_ATTACH     0x0008  /* message has an attachment */
#define MAIL_IMP_HIGH   0x0010  /* message is of high importance */
#define MAIL_IMP_LOW    0x0020  /* message is of low importance */
#define MAIL_FLAGGED    0x0040  /* message has been flagged */
#define MAIL_REPLIED    0x0080  /* message has been replied to */
#define MAIL_DRAFT      0x0100  /* message is a draft */
#define MAIL_NEW        0x0200  /* message is new */
#define MAIL_DELETED    0x8000  /* message is deleted */

Je dois ajouter un nouveau:

#define MAIL_SPAM       0x????  /* message is spam */ 

Y at-il une raison, la liste drapeau existants skips de 0x0200 tout le chemin à 0x8000? Je crois comprendre que les valeurs utilisables pour mon nouveau drapeau serait 0x0400, 0x0800 et 0x1000-0x4000. Suis-je mal compris quelque chose sur la façon dont fonctionnent ces bitsets?

Était-ce utile?

La solution

Oui, vous avez raison -. Ces valeurs manquantes sont en drapeau théorie utilisable, à moins qu'ils ne réservés à autre chose

vous aurez besoin de vérifier auprès de l'auteur original s'il y a une raison spécifique pour laquelle ils ont été sautées et sont allés jusqu'à 0x8000 droite.

Il n'y a certainement pas intrinsèque comportement dans les champs de bits qui empêcherait leur utilisation.

Autres conseils

En un mot, votre compréhension est très bien.

Nous ne pouvons que deviner pourquoi MAIL_DELETED est 0x8000 et non, disons, 0x0400; je pense serait que le bit le plus élevé a été choisi en raison de la nature dramatique du « supprimé » drapeau.

La partie la plus délicate de l'introduction d'un nouveau bit dans le bitmask de quelqu'un d'autre est que vous devez vous assurer que les bits qui apparaissent inutilisés sont effectivement utilisés et qu'ils sont toujours initialisés toujours.

Tout dépend de qui l'a écrite à ce qu'ils signifie par leurs positions binaires choisies. Cependant, d'après ce que je peux voir, on dirait qu'ils ont regroupé les drapeaux de bits logiquement en octets.

Pour vous, vous pourriez faire un cas pour:

#define MAIL_SPAM        0x0400 /* message is spam */

Comme il semble comme un état semblable à nouveau ou projet mais pas supprimé.

Je ne suis pas au courant de votre application, mais en théorie, les valeurs 0x400,0x800,0x1000,0x2000 et 0x4000 ne sont pas définis et correspondent parfaitement à vos autres définit, afin que vous puissiez ajouter de nouvelles définir avec ces valeurs.

On dirait une mauvaise documentation pour moi. Je l'aurais placé MAIL_FLAG_UNUSED dans les derniers emplacements de bits de sorte qu'il était évident qu'ils étaient disponibles. Assurez-vous que MAIL_NEW n'utilise pas les bits plus élevés pour une sorte de valeur intrinsèque, mais à la surface, vous ne semblez avoir un tas de bits disponibles à partir de 0x0400 à travers 0x4000.

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