首页 > 技术文章 > 位运算骚操作

fdbwymz 2021-07-05 14:00 原文

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

 

推荐阅读