int n = 6; for (int k = 1; k <= n; k++){ for (int s = (1 << k)-1,u = 1 << n; s < u;){ for (int i = 0;i < n;i++) printf("%d",s>>(n-1-i)&1); printf(" "); int b = s & -s; s = (s+b)|(((s^(s+b))>>2)/b); } }
就是这么一段小程序...可以按1的个数升序枚举1~2^n所有值 , 其中最后一句位运算更是感觉超酷...
我暂时能看懂的:
s起始前k位都为1
b是s的最低位
结果还是看不懂...不得不佩服这个位运算巨巨写出来的