2011-11-30 75 views
2

我有一個旗控股整數,具有現有的一組可能的標記:標誌位集合,避免碰撞,C

#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 */ 

我需要添加一個新的:

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

現有的標誌列表從0x0200一直跳到0x8000是否有原因?我的理解是,我的新標誌的可用值將是0x0400,0x0800和0x1000-0x4000。我誤解了這些bitset的工作原理嗎?

+2

可能被保留,或者他們不希望你知道它。 – Joe

回答

2

是的,你是對的 - 那些缺失的標誌值在理論上是可用的,除非它們被保留用於別的東西。

如果有任何特定的原因導致他們被跳過並直接跳到0x8000,您需要與原作者覈對。

肯定沒有固有的在位域中的行爲會阻止它們的使用。

2

這一切都取決於誰寫他們的意味着他們選擇的位位置。但是,從我所看到的看起來,它們將位標誌按邏輯分組爲字節。

對於你的,你可以做一個案例:

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

因爲它似乎是相似的新的或草案,但不會被刪除的狀態。

3

簡而言之,你的理解很好。

我們只能猜測爲什麼MAIL_DELETED0x8000而不是說,0x0400;我的猜測是,由於「刪除」標誌的戲劇性,選擇了最高位。

將一個新位引入別人的位掩碼中最棘手的部分是您需要確保顯示未使用的位實際上未被使用,並且始終始終進行初始化。

0

我對你的應用程序並不熟悉,但理論上,值0x400,0x800,0x1000,0x2000和0x4000沒有定義,完全符合你的其他定義,所以你可以添加新的 定義這些值。

0

聽起來像對我來說很糟糕的文檔。我已經把MAIL_FLAG_UNUSED放在最後的幾個位槽中,這樣很顯然它們是可用的。檢查以確保MAIL_NEW沒有使用某些內嵌值的高位,但表面上看起來似乎有一堆位從0x0400到0x4000。

+0

Bah - 今天早上太多的10k +業力海報。回去爲我工作:) –