位运算骚操作

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

 

posted @ 2021-07-05 14:00  失败者_ant  阅读(40)  评论(0编辑  收藏  举报