其他分享
首页 > 其他分享> > 异或

异或

作者:互联网

异或运算满足交换率、结合律。

性质:

  1. a^0 = a
  2. a^a = 0

应用:

  1. 不需额外变量交换两个数的值(前提是a和b不能在同一个内存单元中)
    a = a^b
    b = a^b
    a = a^b

  2. 提取出int类型最右边的1
    a & (~a + 1)

  3. 一个数组中有两个数出现了奇数次,其他数都出现了偶数次,求出现奇数次的这两个数?
    用一个变量eor将数组中所有的数异或一遍,假设a,b出现了奇数次,且a不等于b,则eor= a^b ,且不为0,所以eor中必有一个位为1。因此可以将eor最右边为1的那一位是否为1可以将整个数组分为两类,一类是该位为1,另一类是该位为0,而a和b必属于两类。因此可以再用一个变量,将该位为1的数异或一遍,就的得到了一个数出现了奇数的数。

int a[6] = { 1,2,2,3,4,4 };//1和3出现了奇数次
    int eor = 0;
    int eor1 = 0;
    int re1;
    int re2;
    for (int i = 0; i < 6; ++i) {
        eor = eor ^ a[i];
    }
    int rightestOne = eor & (~eor + 1);
    for (int i = 0; i < 6; ++i) {
        if ((a[i] & rightestOne) == 0) {//该位为0的数
            eor1 = eor1 ^ a[i];
        }
    }
    re1 = eor1;
    re2 = eor ^ re1;
    cout << re1 << "," << re2 << endl;

标签:该位,eor1,int,re1,eor,异或
来源: https://www.cnblogs.com/dylan-blog/p/16478034.html