五个人,每个人只有去或者不去,用1代表去,用0代表不去,所以,可能的组合如下:
A B C D E
0 0 0 0 1
0 0 0 1 0
0 0 0 1 1
0 0 1 0 0
。。。。。
这样总共有32种,每一种按这个排列,那么可以用 1 到 32 这32个数代表32个可能的组合;
for(int I=0; I<32; ++I)
这个for循环是为了遍历所以32种组合
if( I>>4 && !((I&8)>>3)) continue;
I右移四位,就只剩下第五位,也就是代表A的那一位;
I按位与8,是把后四位弄出来,然后再右移3位,就把第四位给弄出来,也就是代表B的那一位;
然后通过 && 操作,保证 A 和 B 同时参加,也就是满足第一个要求。
其它的按照这个分别满足剩下的要求。
if( I>>4 && !((I&8)>>3)) continue; 例如I的值是31,二进制既是11111,逻辑意思就是A,B,C,D,E都去。I>>4为真表示A去,(I&8)>>3为真表示B去,所以if的意思是如果A去了而B没去就continue;
看看,走了.
好