bitset bandiera, evitando collisioni, C
Domanda
Ho un intero bandiera-holding che ha un insieme esistente di possibili bandiere:
#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 */
Ho bisogno di aggiungere uno nuovo:
#define MAIL_SPAM 0x???? /* message is spam */
C'è un motivo per i cassonetti della lista bandiera esistenti dal 0x0200 fino a 0x8000? La mia comprensione è che i valori utilizzabili per la mia nuova bandiera sarebbero 0x0400, 0x0800 e 0x1000-0x4000. Sto malinteso qualcosa su come questi bitset lavoro?
Soluzione
Sì, siete sulla strada giusta -. Questi valori di bandiera mancanti sono in teoria utilizzabile, a meno che siano riservati per qualcos'altro
avresti bisogno di verificare con l'autore originale se non c'è alcun motivo specifico per cui sono stati ignorati e andato dritto a 0x8000
.
Non c'è certamente intrinseca il comportamento in campi di bit che impedirebbe l'uso.
Altri suggerimenti
In poche parole, la vostra comprensione va bene.
Possiamo solo immaginare il motivo per cui è MAIL_DELETED
0x8000
e non, per esempio, 0x0400
; La mia ipotesi è che il bit più alto è stato scelto a causa della natura drammatica della "cancellato" bandiera.
La parte più difficile di introdurre un nuovo bit nella maschera di bit di qualcun altro è che è necessario fare in modo che i bit che appaiono non utilizzati sono in realtà non utilizzati e che sono sempre inizializzati in modo coerente.
Tutto dipende da chi lo ha scritto su ciò che significa dalle loro posizioni di bit scelti. Tuttavia, da quello che posso vedere sembra che raggruppati i flag di bit logicamente in byte.
Per la vostra, si potrebbe fare un caso per:
#define MAIL_SPAM 0x0400 /* message is spam */
Poiché sembra come uno stato simile a Nuovo o Draft, ma non eliminato.
Non ho dimestichezza con l'applicazione, ma in teoria, i valori e le 0x400,0x800,0x1000,0x2000 0x4000 non sono definiti e si adattano perfettamente alle vostre altre definisce, in modo da poter aggiungere nuovi definire con quei valori.
suona come scarsa documentazione per me. Avrei messo MAIL_FLAG_UNUSED negli ultimi slot bit in modo che era ovvio che fossero disponibili. Controllare per assicurarsi che MAIL_NEW non utilizza i bit più alti per una sorta di valore intrinseco, ma in superficie, che non sembrano avere un mucchio di bit disponibili da 0x0400 tramite 0x4000.