運算
效果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表示該數為奇...