2010-03-31 59 views
0

可以说我必须提供一个值作为位掩码。如何动态组合一个位掩码?

NSUInteger options = kFoo | kBar | kFooBar; 

并且让我们说位掩码真的很大,可能有100个选项。但我有哪些选择取决于很多情况。我怎么能动态组成这样一个位掩码?

这有效吗?

NSUInteger options; 

if (foo) { 
    options = options | kFoo; 
} 

if (bar) { 
    options = options | kBar; 
} 

if (fooBar) { 
    options = options | kFooBar; 
} 

(尽管这样做时,这可能会崩溃|位掩码运营商的事“无中生有”

+0

复制(同一用户):http://stackoverflow.com/questions/2555101 – 2010-03-31 17:42:39

+0

请在位掩码一些基本的阅读,你再问了。 http://en.wikipedia.org/wiki/Mask_%28computing%29 – codewarrior 2010-04-01 02:08:40

回答

2

你几乎拥有了它,除非你需要位域初始化为0,你。加入更多的比特:

NSUInteger options = 0; 

if (foo) options |= kFoo; 
if (bar) options |= kBar; 
// etc. 

另外请注意,一个位域只能容纳比特(通常是32或64位)的一个有限数量如果需要更多的位(例如,你提到的100),则需要。整数数组,并且在设置和开始时需要特别小心g位来访问右边的数组元素和该元素的右边位。

+0

此时,您需要使用位的索引,而不是面具值,因为掩模值被限制为典型的32或64位,就像好。或者将其分成几个位域 - 当然这100个选项可以分为几类? – 2010-04-01 07:14:40