前言
從現(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;