通过位运算求一个集合的子集

来源:互联网 发布:万国数据fm经理待遇 编辑:程序博客网 时间:2024/05/17 06:01

整体的思路:
首先要清楚位运算的意义:
1<<n 的意义是2的n次方
num<<i 就是num化为二进制的存储,整体左移i位
num>>i 就是num化为二进制的存储,整体左移i位
这样我 的第一个循环0,1,2,,,,,,((2^n) -1)
就是将一个集合的所有可能的组合方式编号
例如一个组合 {3,2,1}
0:000:空集
1:001 :3
2:010:2
3:011:2,3
4:100:1
5:101:1,3
6:110:1,2
7:111:1,2,3
这样我们与(1<<i)做按位做与运算
1<<0:3
1<<1:2
1<<2:1
当这个下标未在集合中时,则结果为0
反之,则在

简洁的代码
for(int i=0;i<(1<<n);i++){    print_subset(n,i,num);}void print_subset(int n,int s,double[] num){         for(int i=0;i<n;i++){            if((s&(1<<i))!=0){                 System.out.print(num[i]+" ");            }        }        System.out.println();     }