常见位运算操作:x>>j&1,判断x二进制下从右往左第j个数是不是1.
如果要枚举32个状态,可以把1<<32,每一位代表一个状态
以两道递归题为例。
题目1:给你1~n个数,从中选取任意多的数,然后输出所有可能的结果
思路分析:每一个数都面临选与不选两种可能性,所以可以用一个二进制下为n位的数来保存每一个结果,如果第k位是0,则表示数k不选,如果第k位为1,则表示数k被选中。
这里保存两种状态,当前要枚举的数是第几个数,还有哪些数已经被枚举过了,这个用一个n位的二进制数实现。并且如果当前数被选进去 ,则将其对应的二进制位置1,state+(1<<cur);
如果没有被选进去,则保存的数组仍然是state。下面上代码
#include<iostream> using namespace std; int n; void dfs(int cur,int state) { if(cur==n) { for(int i=0;i<n;i++) { if(state>>i&1) cout<<i+1<<" "; } cout<<"\n"; } else { dfs(cur+1,state); dfs(cur+1,state+(1<<cur)); } } int main() { cin>>n; dfs(0,0); return 0; }
二