有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归(腾讯面试题)

int main()
{
	char *str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int num=26;

	for(int i=0;i<(1<<num);i++)//1<<26为2的26次方 ,循环①
	{
		for(int j=0;j<num;j++)//j表示二进制右数第几位,循环②
		{
			if((i&(1<<j))!=0)
			{
				printf("%c",str[j]);
			}
		}
		printf("\n");
	}
}

分析:首先看图了解大概
有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归(腾讯面试题)

然后具体代码分析:
结果数据太多的话难分析,就当num=3的时候分析,结果如图所示:

有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归(腾讯面试题)

有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归(腾讯面试题)
有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归(腾讯面试题)
1<<num 即为1<<3=8,即进行8次循环打印。
当i=0,num=3,;
j=0时,1<<j 等同于 1<<0位,为1 ;0&1为0;
j=1时,1<<j 等同于 1<<1位,二进制为10; 0&10 为0;
j=2时,1<<j 等同于 1<<2位,二进制位100;0&100为0;
j小于3。
(打印换行)

当i=1,num=3;
j=0时,1<<j 等同于 1<<0位,二进制为1 ;1&1为1,打印str[0]为A;
j=1时,1<<j 等同于 1<<1位,二进制为10; 1&10 即01&10为0,不打印;
j=2时,1<<j 等同于 1<<2位,二进制位100;1&100即001&100为0,不打印;
j小于3。
(换行后打印A)
(打印换行)

当i=2,num=3; i为2换成二进制为10
j=0时,1<<j 等同于 1<<0位,二进制为1 ;10&01为0;
j=1时,1<<j 等同于 1<<1位,二进制为10; 10&10 即01&10为1,打印str[1]为B;
j=2时,1<<j 等同于 1<<2位,二进制位100;10&100为即010&100为0,不打印;
j小于3。
(换行打印B)
(打印换行)

当i=3,num=3; i为3换成二进制为11
j=0时,1<<j 等同于 1<<0位,二进制为1 ;11&01为1,打印str[0]为A;
j=1时,1<<j 等同于 1<<1位,二进制为10; 11&10 为10,打印str[2]为B;
j=2时,1<<j 等同于 1<<2位,二进制位100;11&100为即011&100为0,不打印;
j小于3。
(换行打印AB)
(打印换行)

当i=4,num=3; i为4换成二进制为100
j=0时,1<<j 等同于 1<<0位,二进制为1 ;100&001为0;
j=1时,1<<j 等同于 1<<1位,二进制为10; 100&010 为0;
j=2时,1<<j 等同于 1<<2位,二进制位100;100&100为1,打印str[2]为C;
j小于3。
(换行打印C)
(打印换行)

当i=5,num=3; i为4换成二进制为101
j=0时,1<<j 等同于 1<<0位,二进制为1 ;101&001为1,打印str[0]为A;
j=1时,1<<j 等同于 1<<1位,二进制为10; 101&010 为0;
j=2时,1<<j 等同于 1<<2位,二进制位100;101&100为1,打印str[2]为C;
j小于3。
(换行打印AC)
(打印换行)

当i=6,num=3; i为6换成二进制为110
j=0时,1<<j 等同于 1<<0位,二进制为1 ;110&001为1;
j=1时,1<<j 等同于 1<<1位,二进制为10; 110&010 为10,打印str[1]为B;
j=2时,1<<j 等同于 1<<2位,二进制位100;110&100为100,打印str[2]为C;
j小于3。
(换行打印BC)
(打印换行)

当i=7,num=3; i为7换成二进制为111
j=0时,1<<j 等同于 1<<0位,二进制为1 ;111&001为001,打印str[0]为A;
j=1时,1<<j 等同于 1<<1位,二进制为10; 111&010 为010,打印str[1]为B;
j=2时,1<<j 等同于 1<<2位,二进制位100;111&100为100,打印str[2]为C;
j小于3。
(换行打印ABC)
(打印换行)

结束!
类似如将数字n转成radix进制的字符串,存放在str中(一样方法),或者是统计二进制中1的个数或者0的个数(参考其中的左移位运算做法)都可以用到类似的方法。