typedef NS_OPTIONS(NSUInteger, BHTestOptions) {
BHTestNone = 0, // 0
BHTestA = 1 << 0, // 0b0001铸敏,將二進(jìn)制的1左移0個(gè)單位(就是不移動(dòng))荒勇,2^0 = 1
BHTestB = 1 << 1, // 0b0010,將二進(jìn)制的1左移1個(gè)單位址否,2^1 = 2
BHTestC = 1 << 2, // 0b0100,將二進(jìn)制的1左移2個(gè)單位盹靴,2^2 = 4
BHTestD = 1 << 3, // 0b1000膘魄,將二進(jìn)制的1左移3個(gè)單位昧港,2^3 = 8
};
// a << b:表示二進(jìn)制的a左移b個(gè)單位崖技。就是在a右邊添加b個(gè)0逻住。
@interface XXXXX: NSObject
@property (nonatomic, assign) BHTestOptions options;
@end
@implementation XXXXX
- (void)test {
BHTestOptions options = BHTestA | BHTestB;
if (options & BHTestB) {
// 位運(yùn)算符:異或(^),表示去掉某個(gè)枚舉值迎献。
options ^= BHTestB;
}
BHTestOptions tempOptions = 0;
if (self.options & BHTestNone) { // 0 & 任何數(shù)瞎访,都是 0。所以永遠(yuǎn)不會(huì)執(zhí)行吁恍。
// Code will never be executed
NSLog(@"永遠(yuǎn)不會(huì)走到這里");
}
// 使用位運(yùn)算符:與(&)扒秸,進(jìn)行條件判斷,表示 self.options 中是否有 BHTestA 這個(gè) option冀瓦。
if (self.options & BHTestA) {
// 使用位運(yùn)算符:或(|)伴奥,用來對(duì) tempOptions 進(jìn)行賦值」净茫可以進(jìn)行多個(gè)值的賦值渔伯。
tempOptions |= BHTestA;
}
if (self.options & BHTestB) {
tempOptions |= BHTestB;
}
if (self.options & BHTestC) {
tempOptions |= BHTestC;
}
/* 執(zhí)行到這里之后顶霞,tempOptions 就包含了 BHTestA肄程、BHTestB、BHTestC选浑。
tempOptions = BHTestA | BHTestB | BHTestC;
*/
}
@end
比較容易忘記的位運(yùn)算符:
^:異或蓝厌,值相同為 0,不同為 1古徒。
~:一元運(yùn)算符拓提,取反。
<<: 左移隧膘,各二進(jìn)制位全部左移代态,右邊補(bǔ) 0。
>>: 右移疹吃,各二進(jìn)制位全部右移蹦疑,右端被移出的低位被舍棄,對(duì)于無符號(hào)數(shù)萨驶,高位補(bǔ) 0歉摧。