我們常常遇到,零碎定義的枚舉中,常常遇到位運算。好像上面代碼塊中所用到的那樣(<<),位運算是怎樣運算的呢?它終究有什麼作用呢?
枚舉與位運算學習Demo鏈接
typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) {
UIViewAnimationOptionLayoutSubviews = 1 << 0,
UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animating
UIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial value
UIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitely
} NS_ENUM_AVAILABLE_IOS(4_0);
我們在寫枚舉參數時,可以用 | 運算符傳入多個枚舉值,比方:UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState。之所以可以這樣寫,是由於在定義枚舉時提供了位運算。我們經過一個Demo來看下其完成辦法
typedef enum : NSUInteger{
/*
first : 0 0 0 0 0 0 0 1 : 1 * 2^0 = 1
second : 0 0 0 0 0 0 1 0 : 1 * 2^1 = 2
third : 0 0 0 0 0 1 0 0 : 1 * 2^2 = 4
*/
first = 1 << 0, // 1 * 2^0 = 1
second = 1 << 1, // 1 * 2^1 = 2
third = 1 << 2 // 1 * 2^2 = 4
} myEnum;
- (void)viewDidLoad {
[super viewDidLoad];
// 1,2,4
NSLog(@"%d,%d,%d",first,second,third);
[self test: first | second];
}
- (void)test:(NSInteger)count
{
// 1 2 0
NSLog(@"%d,%d,%d",count & first,count & second,count & third);
if (count & first) {
NSLog(@"first");
}
if (count & second) {
NSLog(@"second");
}
if (count & third) {
NSLog(@"third");
}
}
位運算
將一個數字轉換成二進制數,枚舉中運用的是1,所以二進制數就是 0000 0001 ,將其轉換成十進制數就是 1 * 2^0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + …… ,實踐上就是 2^0 。
而位運算 1 << 1,就是 0000 0010 ,將1向左挪動1位,其後果就是 0 * 2^0 + 1 * 2^1 +……,後果是2 。同理,其它幾個後果也是這麼運算的
判別 | 運算符都傳入了哪些值如下面的Demo所示,經過&運算符,即可判別 | 運算符都傳入了哪些值
count & first // 判別能否傳入了first,假如傳入了,值為1,否則為0
count & second // 判別能否傳入了second,假如傳入了,值為2,否則為0
count & third // 判別能否傳入了third,假如傳入了,值為4,否則為0
【枚舉中的位運算學習筆記】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!