声明位掩码:
或者到指定的绝对值(1
,2
,4
......),你可以声明bitmasks(这些是如何称呼)这样的:
typedef enum : NSUInteger {
FileNotDownloaded = (1 << 0), // => 00000001
FileDownloading = (1 << 1), // => 00000010
FileDownloaded = (1 << 2) // => 00000100
} DownloadViewStatus;
或利用现代ObjC的NS_OPTIONS
/NS_ENUM
宏:
typedef NS_OPTIONS(NSUInteger, DownloadViewStatus) {
FileNotDownloaded = (1 << 0), // => 00000001
FileDownloading = (1 << 1), // => 00000010
FileDownloaded = (1 << 2) // => 00000100
};
(参见Abizern's answer关于后者的详细信息)
位屏蔽的概念是(通常)以单个比特组定义每个枚举值。
因此OR
荷兰国际集团的两个值执行以下操作:
DownloadViewStatus status = FileNotDownloaded | FileDownloaded; // => 00000101
这相当于:
00000001 // FileNotDownloaded
| 00000100 // FileDownloaded
----------
= 00000101 // (FileNotDownloaded | FileDownloaded)
比较位掩码:
有一件事对位掩码检查时要牢记:
检查确切的相等性:
让我们假设状态这样的初始化:
DownloadViewStatus status = FileNotDownloaded | FileDownloaded; // => 00000101
如果你想检查是否status
等于FileNotDownloaded
,你可以使用:
BOOL equals = (status == FileNotDownloaded); // => false
这相当于:
00000101 // (FileNotDownloaded | FileDownloaded)
== 00000100 // FileDownloaded
-----------
= 00000000 // false
检查“会员制”:
如果你想检查是否status
仅仅包含FileNotDownloaded
,你需要使用:
BOOL contains = (status & FileNotDownloaded) != 0; // => true
00000101 // (FileNotDownloaded | FileDownloaded)
& 00000100 // FileDownloaded
-----------
= 00000100 // FileDownloaded
!= 00000000 // 0
-----------
= 00000001 // 1 => true
见的细微差别(为什么你目前的“如果” -expression是可能是错的)?
你的'(subview.tag == viewStatus)'看起来不对我。应该是'((subview.tag&viewStatus)!= 0x0)',除非你想检查确切的匹配。在这种情况下,你首先不需要位掩码,但只是一个普通的旧枚举。看到我的答案的后半部分。 – Regexident 2013-04-23 11:17:58