位運(yùn)算的運(yùn)用

前言

從現(xiàn)代計(jì)算機(jī)電路來(lái)說(shuō),只有高電平/低電平兩種狀態(tài),即為0/1狀態(tài),計(jì)算機(jī)中所有的數(shù)據(jù)按照具體的編碼格式以二進(jìn)制的形式存儲(chǔ)在設(shè)備中。

位運(yùn)算符

使用的運(yùn)算符包括下面:

運(yùn)算符 含義
& 按位與
按位或
! 按位非
~ 按位取反
^ 按位異或
<< 左移
>> 右移

NS_OPTIONS 和 NS_ENUM

iOS設(shè)計(jì)枚舉的時(shí)候?yàn)槭裁匆O(shè)計(jì)兩種:NS_OPTIONS和NS_ENUM兩種呢?因?yàn)橛袝r(shí)候用戶選擇的枚舉類型是多選的(NS_OPTIONS)而不是互斥的(NS_ENUM)
比如iOS的UIViewAutoresizing

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,  //000000
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,//000001
    UIViewAutoresizingFlexibleWidth        = 1 << 1,//000010
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,//000100
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,//001000
    UIViewAutoresizingFlexibleHeight       = 1 << 4,//010000
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 //100000
};

當(dāng)用戶需要多種約束時(shí)UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin = 000001 | 000010 | 000100 = 000111;當(dāng)你想知道這個(gè)多選中是否包含哪一種時(shí)只需要將這個(gè)結(jié)果和那個(gè)單選二進(jìn)制進(jìn)行按位與&,如果與之后為零說(shuō)明不包含,否則包含該選項(xiàng),如何我想知道上面的多選約束中是否包含UIViewAutoresizingFlexibleWidth(000010),使用&運(yùn)算: 000111 & 000010 = 000010 (!= 0) 說(shuō)明包含該約束條件。

位運(yùn)算在算法中的妙用

  • 判斷n是否是2的正整數(shù)冪

觀察2的正整數(shù)冪的二進(jìn)制有何特點(diǎn)?

十進(jìn)制n 二進(jìn)制n 二進(jìn)制(n-1) 二進(jìn)制(n&(n-1))
1 00001 00000 00000
2 00010 00001 00000
4 00100 00011 00000
8 01000 00111 00000
16 10000 01111 00000

不難看出n是2的正整數(shù)冪的充要條件就是n&(n-1) == 0。

根據(jù)這一特性我們可以拓展思維:如何計(jì)算出一個(gè)數(shù)n的二進(jìn)制中有多少個(gè)1?代碼如下:

 int calculteNumOfOneForInt(int n) {
       int num = 0;
       while(n != 0) {
          n = n&(n-1);
          num++;
       }
     return num;
}
  • 一個(gè)int數(shù)組中除了一個(gè)數(shù)之外其他數(shù)都是一對(duì),求這個(gè)單數(shù)

此題需要用到異或運(yùn)算^,首先來(lái)了解異或的特點(diǎn):

a.    0^n = n
b.    n^n = 0;
c.    a^b^c = b^a^c (無(wú)序性)

所以由以上三個(gè)特性可知:將數(shù)組中的所有數(shù)進(jìn)行異或后所有成雙成對(duì)的數(shù)都被消滅了剩下的是那個(gè)單數(shù)。

思維延展:數(shù)組中有兩個(gè)元素出現(xiàn)了奇數(shù)次,其他元素出現(xiàn)了偶數(shù)次。找出這兩個(gè)元素。

  • 如何只通過(guò)兩個(gè)變量就可以完成兩個(gè)數(shù)的交換
 a = a^b;
 b =  a^b;
 a =  a^b;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容