位運算在iOS中的使用

2021-10-12 06:55:49 字數 3521 閱讀 1008

本文主要講解三個運算子 左移(<<)、與(&)、或(|)  在ios**中如何使用。

我們經常能看到下面這樣的**

uiview*view = [[uiviewalloc]init];

view.autoresizingmask=uiviewautoresizingflexiblewidth|uiviewautoresizingflexibleheight;

[self.viewaddsubview:view];

意思是,自動調整自己的寬度,保證與superview左邊和右邊的距離不變。自動調整自己的高度,保證與superview頂部和底部的距離不變。檢視autoresizingmask的型別,其實是nsuinteger 如下

typedef ns_options(nsuinteger, uiviewautoresizing) {

uiviewautoresizingnone                 =0,

uiviewautoresizingflexibleleftmargin   =1<<0,

uiviewautoresizingflexiblewidth        =1<<1,

uiviewautoresizingflexiblerightmargin  =1<<2,

uiviewautoresizingflexibletopmargin    =1<<3,

uiviewautoresizingflexibleheight       =1<<4,

uiviewautoresizingflexiblebottommargin =1<<5

那麼乙個nsuinteger的型別,是怎樣告訴view,既要調整自己的寬度,又要調整自己的高度的呢?

左移運算子 <<    

公式 x << 3 就是把x的各二進位左移3位

1<<1  實際就是  0001 << 1  = 0010   轉成十進位制後就是  2

1<<4  實際就是  0001 << 4  = 10000  轉成十進位制後就是  16

uiviewautoresizingflexiblewidth   =  00010

uiviewautoresizingflexibleheight = 10000

或運算子 |

只要對應的二個二進位有乙個為1時,結果位就為1

00010 | 10000  = 10010

uiviewautoresizingflexiblewidth|uiviewautoresizingflexibleheight 就是

00010 | 10000 = 10010

autoresizingmask 的結果就是二進位制數 10010,我們如何知道 是哪個選項被選中了?

與運算子 &

只有對應的二個二進位都為1時,結果位才是1

10010 & 00010 = 00010

判斷選項是否被選中的方法如下

if(view.autoresizingmask&uiviewautoresizingflexiblewidth){

nslog(@"uiviewautoresizingflexiblewidth被選中了"); //code1

autoresizingmask = 10010

uiviewautoresizingflexiblewidth  = 00010

10010 & 00010 = 00010 等價於十進位制 2,為真,所以code1被執行。

if(view.autoresizingmask&uiviewautoresizingflexibleheight){

nslog(@"uiviewautoresizingflexibleheight被選中了");//code2

autoresizingmask = 10010

uiviewautoresizingflexiblewidth  = 10000

10010 & 10000 = 10000 等價於十進位制 16,為真,所以code2被執行。

if(view.autoresizingmask&uiviewautoresizingflexibleleftmargin){

nslog(@"uiviewautoresizingflexibleleftmargin");//code3

autoresizingmask = 10010

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){

//識別鏈結邏輯**

if(types & fwdetectortypesemoji){

//識別表情邏輯**

if(types & fwdetectortypesphonenumber){

//識別**號碼邏輯**

if(types & fwdetectortypesemail){

//識別郵箱邏輯**

明白三個運算子 左移(<<)、與(&)、或(|) 的運算法則,就能理解uiview的屬性autoresizingmask

乙個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,有符號數,各編譯器處理方法不一樣,有的補符號位 算術右移 有的...