常見的位運算

2021-10-03 09:01:11 字數 1174 閱讀 1474

運算

效果x << 1、x >> 1

乘、除2

x & 1

判斷x是否為奇數

x & (x - 1)

去掉x最低位的1

x & (-x)

取出最低位的1

x & (1 << (i - 1))

判斷二進位制下x的第i位是不是1

x | (1 << (i - 1))

把二進位制下x的第i位變成1

由於今天是第一次運用狀態壓縮,所以總結一下剛剛做的用了狀態壓縮的乙個題目。先附上這個題目:

從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式

輸入乙個整數n。

輸出格式

每行輸出一種方案。

同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。

對於沒有選任何數的方案,輸出空行。

本題有自定義校驗器(spj),各行(不同方案)之間的順序任意。

資料範圍

1≤n≤15

輸入樣例:

3輸出樣例:3

22 3

11 3

1 21 2 3

思路:運用狀態壓縮:每個數有取和不取兩種狀態,可以把每個數壓縮到乙個二進位製上,這個數就是二進位制對應的位數,而這個數的狀態就是對應位的取值,0表示不取,1表示取。

舉例:101011,即取1、2、4、6

**如下:

#include

using namespace std;

int n;

void

dfs(

int step,

int state)

cout << endl;

return;}

dfs(step +

1, state)

;//不選state

dfs(step +

1, state |

1<< step)

;//選state:state | (i << step)可以把state第step位變成1,而其他位不變

}int

main()

常見的位運算

計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位操作就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率非常高,在程式中盡量使用位運算進行操作,這會大大提高程式的效能。位操作是各大網際網路公司面試經常會問的一類問題。int a 8 a 3 移位前 0000 0000 0000 000...

常見位運算

builtin ffs x 返回x的最後一位1是從後向前第幾位 builtin popcount x 返回x的二進位制下1的個數 x x 只保留最後一位1的二進位制 x x x 1 清零最低位的1 x 1 判斷奇偶 x 1 n 將第n位置1 x 1 n 將第n位置0 x 1 k 1 對x的第k位取反...

幾個常見的位運算

程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。and運算 and運算通常用於二進位制的取位操作,例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇...