-1
我有36個Bool相關的標誌。有沒有辦法枚舉這個,或者是一個數組/別的我唯一的選擇?可能bitmask更多的值比int可以容納?
起初我試圖使用位掩碼枚舉,但我意識到這些溢出的枚舉大小,並給我不好的結果。
我不需要將這些像選項掩碼(它們彼此獨立),只是組合。
謝謝!
我有36個Bool相關的標誌。有沒有辦法枚舉這個,或者是一個數組/別的我唯一的選擇?可能bitmask更多的值比int可以容納?
起初我試圖使用位掩碼枚舉,但我意識到這些溢出的枚舉大小,並給我不好的結果。
我不需要將這些像選項掩碼(它們彼此獨立),只是組合。
謝謝!
如果我明白你的問題,那麼下面可能的工作:
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);
}
在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;
其中'int'不是至少36位(如86),這將不會對架構工作。實際上,它調用未定義的行爲,因爲36比32位整數的最大允許移位大。 – 2015-02-11 17:37:32
我試過這個,它看起來工作正常 - 所有必須做的就是像1ULL << whichFlag。也正如其他帖子中所建議的那樣,我在uint64_t上支持ivar – BoombaleOsby 2015-02-11 18:30:01