貓貓分享福铅,必須精品
原創(chuàng)文章萝毛,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:翟乃玉的博客
地址:http://www.reibang.com/notebooks/4236923/latest
一:問題來源
最早時候滑黔,貓在學(xué)習(xí)通知時候(是系統(tǒng)通知不是NSNotificationCenter
)用到一種很奇特的寫法:
//注冊通知
if ([UIDevice currentDevice].systemVersion.doubleValue<8.0) {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
}
else {
[[UIApplication sharedApplication] registerForRemoteNotifications];
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil]];
}
這里在判斷系統(tǒng)盤本后的設(shè)置中笆包,我們用到了|符號來做連接。
這里用或符號略荡,可以實(shí)現(xiàn)多選的效果庵佣,于是貓貓就像,我去汛兜,好牛逼巴粪,然后在有一次設(shè)置圖片的時候,貓貓想讓一張圖片既要自動填充又要自動粥谬。肛根。。說的好暈漏策,就是想設(shè)置view的contentMode可以用兩個枚舉派哲,比如UIViewContentModeTop | UIViewContentModeScaleAspectFill
這樣寫。
然后貓就發(fā)現(xiàn)掺喻,貓?zhí)煺媪税沤欤娴臎]用储矩。
二:解決
其實(shí)當(dāng)時的問題并沒有解決,只是說貓搞明白了為何用有的地方用或可以喉脖,而有的地方就不能用或椰苟。
1:發(fā)現(xiàn)
-
首先我們進(jìn)入
UIViewContentMode
的代碼當(dāng)中。
這里可以看到树叽,不能用或連接的定義的枚舉是這樣的舆蝴。 -
然后我們進(jìn)入
UIUserNotificationType
的代碼當(dāng)中。
可以用或來連接的枚舉是這樣的题诵,用1 << 0 (位運(yùn)算左移來定義的)
2:猜測
于是很容易洁仗,貓猜測肯定跟這個枚舉的定義是否用左移來定義有關(guān)系,經(jīng)過測試性锭,所有的枚舉 << 定義的都可以用 | 來連接赠潦,做判斷,其他的都不行草冈,只能一個一個的她奥。
3:驗(yàn)證
- 定義以下代碼:
int a = 1 << 0; // 1 0001
int b = 1 << 1; // 2 0010
int c = 1 << 2; // 4 0100
int d = 1 << 3; // 8 1000
void content(int value)
{
if (value & a) NSLog(@"value里面有a");
if (value & b) NSLog(@"value里面有b");
if (value & c) NSLog(@"value里面有c");
if (value & d) NSLog(@"value里面有d");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
content(a | b | c | d);
}
return 0;
}
- 運(yùn)行結(jié)果:
- 解析
其實(shí)iOS底層就是這么做的,原理八九不離十怎棱,主要運(yùn)用了 & 和 | 的運(yùn)算符的特性:
*** | 或 : 只要有1個是1, 結(jié)果就是1***
*** & 與 : 只有2個都是1, 結(jié)果才是1***
以及:
*** 1 << n == 2的n次方***
然后可知哩俭,當(dāng)我們用左移來定義時候,可以得到:
int a = 1 << 0 = 1 = 0001
int b = 1 << 1 = 2 = 0010
int c = 1 << 2 = 4 = 0100
int d = 1 << 3 = 8 = 1000
然后可以看出拳恋,abcd分別代表二進(jìn)制的某一位是1凡资,而進(jìn)行&運(yùn)算,就能得到了谬运。
- 重點(diǎn):
與和或就記住下面的就行了隙赁,實(shí)在不行就用系統(tǒng)自帶的計算器吧。
*** | 或 : 只要有1個是1, 結(jié)果就是1***
*** & 與 : 只有2個都是1, 結(jié)果才是1***