2015-02-11 56 views
-1

我有36個Bool相關的標誌。有沒有辦法枚舉這個,或者是一個數組/別的我唯一的選擇?可能bitmask更多的值比int可以容納?

起初我試圖使用位掩碼枚舉,但我意識到這些溢出的枚舉大小,並給我不好的結果。

我不需要將這些像選項掩碼(它們彼此獨立),只是組合。

謝謝!

回答

-1

如果我明白你的問題,那麼下面可能的工作:

enum flags 
{ 
    .. 36 appropriatly named entries 
}; 

long long int myFlags = 0LL; 

int getFlag(enum flags whichFlag) 
{ 
    return((myFlags&(1<<whichFlag)? 1:0); 
} 

void setFlag(enum flags whichFlag) 
{ 
    myFlags |= (1<<whichFlag); 
} 
+0

其中'int'不是至少36位(如86),這將不會對架構工作。實際上,它調用未定義的行爲,因爲36比32位整數的最大允許移位大。 – 2015-02-11 17:37:32

+0

我試過這個,它看起來工作正常 - 所有必須做的就是像1ULL << whichFlag。也正如其他帖子中所建議的那樣,我在uint64_t上支持ivar – BoombaleOsby 2015-02-11 18:30:01

0

在C,枚舉基本上沒有別的不僅僅是一個int;因此,枚舉被限制爲整數的最大大小。 如果你想有標誌的任意號碼,你可以使用一個位域:

struct flags { 
    unsigned f0 :1; 
    unsigned f1 :1; 
    unsigned f2 :1; 
    unsigned f3 :1; 
    unsigned f4 :1; 
    unsigned f5 :1; 
    unsigned f6 :1; 
    unsigned f7 :1; 


    ... 

    unsigned f35 :1; 
}; 

struct flags f; 

f.f33 = 1; 
f.f14 = 0; 
相關問題