位运算求子集数

一道求子集的题:具体就是算一个给出的集合中的所有的子集,有人用递归实现,不过我还是喜欢用位运算来做。

 

原理是这样的,工具给出的集合的大小X,我们可以得到子集的大小:(1<<X),然后,我们可以通过将每个子集的

序号与数组中的每一位做运算,然后将结果写回数组。这里,数组的每一位1或者0(1代表输出),数组的大小由

子集大小的二进制的位数决定,具体开代码:

 

 

#include <stdio.h> #include <stdlib.h> // // 求子集 // #define MAX_SIZE 4 int gArray[MAX_SIZE] = {0}; int gArrayB[MAX_SIZE] = {1, 2, 3, 4}; void Test() { for(int i = 0; i < (1 << MAX_SIZE); ++i) // 得到子集的总的个数 { for (int j = 0; j < MAX_SIZE; ++j) // 数组中:1、代表输出;0、不输出 { if ((i & (1 << j)) == 0) // 将 1 左移j位,这里用到的思想是,将子集转换成二进制,用数组的每一位来表示出啦 { gArray[j] = 0; } else { gArray[j] = 1; } } for (int k = 0; k < MAX_SIZE; ++k) // 输出每次的到的二进制结果 { if (1 == gArray[k]) { printf("%d", gArrayB[k]); } // printf("%d", gArray[k]); } printf("/n"); } } int main() { Test(); return 0; }

 

PS:<<,,>> 移位运算,所移位数在右边。

 

你可能感兴趣的:(位运算求子集数)