本文主要講解三個運算子 左移(<<)、與(&)、或(|) 在ios**中如何使用。
我們經常能看到下面這樣的**
uiview*view = [[uiviewalloc]init];意思是,自動調整自己的寬度,保證與superview左邊和右邊的距離不變。自動調整自己的高度,保證與superview頂部和底部的距離不變。檢視autoresizingmask的型別,其實是nsuinteger 如下view.autoresizingmask=uiviewautoresizingflexiblewidth|uiviewautoresizingflexibleheight;
[self.viewaddsubview:view];
typedef ns_options(nsuinteger, uiviewautoresizing) {那麼乙個nsuinteger的型別,是怎樣告訴view,既要調整自己的寬度,又要調整自己的高度的呢?uiviewautoresizingnone =0,
uiviewautoresizingflexibleleftmargin =1<<0,
uiviewautoresizingflexiblewidth =1<<1,
uiviewautoresizingflexiblerightmargin =1<<2,
uiviewautoresizingflexibletopmargin =1<<3,
uiviewautoresizingflexibleheight =1<<4,
uiviewautoresizingflexiblebottommargin =1<<5
左移運算子 <<uiviewautoresizingflexiblewidth = 00010公式 x << 3 就是把x的各二進位左移3位
1<<1 實際就是 0001 << 1 = 0010 轉成十進位制後就是 2
1<<4 實際就是 0001 << 4 = 10000 轉成十進位制後就是 16
uiviewautoresizingflexibleheight = 10000
或運算子 |uiviewautoresizingflexiblewidth|uiviewautoresizingflexibleheight 就是只要對應的二個二進位有乙個為1時,結果位就為1
00010 | 10000 = 10010
00010 | 10000 = 10010
autoresizingmask 的結果就是二進位制數 10010,我們如何知道 是哪個選項被選中了?
與運算子 &判斷選項是否被選中的方法如下只有對應的二個二進位都為1時,結果位才是1
10010 & 00010 = 00010
if(view.autoresizingmask&uiviewautoresizingflexiblewidth){autoresizingmask = 10010nslog(@"uiviewautoresizingflexiblewidth被選中了"); //code1
uiviewautoresizingflexiblewidth = 00010
10010 & 00010 = 00010 等價於十進位制 2,為真,所以code1被執行。
if(view.autoresizingmask&uiviewautoresizingflexibleheight){autoresizingmask = 10010nslog(@"uiviewautoresizingflexibleheight被選中了");//code2
uiviewautoresizingflexiblewidth = 10000
10010 & 10000 = 10000 等價於十進位制 16,為真,所以code2被執行。
if(view.autoresizingmask&uiviewautoresizingflexibleleftmargin){autoresizingmask = 10010nslog(@"uiviewautoresizingflexibleleftmargin");//code3
uiviewautoresizingflexiblewidth = 00001
10010 & 00001 = 00000 等價於十進位制 0,為假,所以code3不會被執行。
這樣我們就知道autoresizingmask 是怎麼起作用的了。
實戰演練:
在**混排時,我麼通常需要在一段文字中,檢測是否有網路位址url, 是否有表情符號emoji,是否有**號碼,是否有郵箱等等。
typedef ns_options(nsuinteger, fwdetectortypes) {fwdetectortypesnone=0,
fwdetectortypesurl=1<<0, //1
fwdetectortypesemoji=1<<1, //2
fwdetectortypesphonenumber=1<<2, //4
fwdetectortypesemail=1<<3, //8
需要識別的型別:預設識別表情如果我們只需要識別表情@property(nonatomic,assign)fwdetectortypes types;
types =fwdetectortypesemoji;如果我們需要同時識別表情,**,鏈結
types =fwdetectortypesemoji |fwdetectortypesurl|fwdetectortypesphonenumber內部邏輯處理時:
if(types & fwdetectortypesurl){明白三個運算子 左移(<<)、與(&)、或(|) 的運算法則,就能理解uiview的屬性autoresizingmask//識別鏈結邏輯**
if(types & fwdetectortypesemoji){
//識別表情邏輯**
if(types & fwdetectortypesphonenumber){
//識別**號碼邏輯**
if(types & fwdetectortypesemail){
//識別郵箱邏輯**
乙個nsuinteger型別,為什麼能列舉出許多種型別了。
位運算在演算法中的應用
leetcode原題位址 題目描述 給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。解法 n n 將除最後一位的1之外的所有的數字置為0 因為 n n 1,所以n n n n 1 例如 7對應的二進位制為0111 7對應的二進位制為1001 7 7 0001 實現 public boolea...
位運算」在程式開發中的妙用!
位運算 位運算子包括 與 非 或 異或 當兩邊運算元的位同時為1時,結果為1,否則為0。如1100 1010 1000 當兩邊運算元的位有一邊為1時,結果為1,否則為0。如1100 1010 1110 0變1,1變0 兩邊的位不同時,結果為1,否則為0.如1100 1010 0110 它適合用在多狀...
位運算在常見場景下的運用
首先需要回顧一下常用的位運算操作 異或運算 兩個位相同為0,相異為1。與運算 兩個位都為1時,結果才為1。或運算 兩個位都為0時,結果才為0。左移 各二進位全部左移若干位,高位丟棄,低位補0。各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位 算術右移 有的...