位运算骚操作
1. 枚举子集
unsigned int s; for(int n=s;n ;n=(n-1)&s) printf(n); printf(n);
2.找出重复次数奇偶性不同的数字
例如2串数字,除x外完全相同,但第2串数字添加了一个x,找出x;
连续异或运算性质:
a ^ a= 0
0 ^ a =a
所以把所有数字连续异或,得到的为x
int ret; for(int x: s1) ret^=x; for(int x: s2) ret^=x; return ret;
3.连续异或消去
0^1^2^3 =0
a ^ a =0
所以 4k^(4k+1)^(4k+2)^(4k+3)=0
连续n个数的异或结果,只有4种情况;
4k
4K^(4k+1) = 1
4k^(4k+1)^(4k+2) = 4k+3
4k^(4k+1)^(4k+2)^(4k+3)=0
4. xor &(-xor)
能得到最小为1的一位
例如
xor=1100
-xor = 0100
xor&(-xor) = 0100
怕什么真理无穷,进一寸有一寸的欢喜