bitset drapeau, évitant les collisions, C
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?
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.