认识异或运算--异或运算的三道题

176 阅读1分钟

异或运算,相同为0,不同为1
方便记忆,可以记为无进位相加。

异或运算的性质: 1)0^N == N N^N == 0 2) 异或运算满足交换律和结合律

如何提取一个数二进制位的最右侧的1
N&((~N)+1)

  1. 如何不用额外变量就交换两个数的值
a=a^b  
b=a^b  
a=a^b

2.一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数? 代码超级简单:

public static void printOddTimesNum1(int[] arr) {
    int eor = 0;
    for (int i = 0; i < arr.length; i++) {
        eor ^= arr[i];
    }
    System.out.println(eor);
}

3.一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数?

/**
 * 假如arr中 a和b出现了一次,其余数都出现了两次
 * @param arr
 */
public static void printOddTimesNum2(int[] arr) {
    int eor = 0;
    for (int i = 0; i < arr.length; i++) {
        eor ^= arr[i];//提取出a^b,  eor=a^b
    }
    //a!=b 所以 eor != 0
    //提取eor最右侧的1
    int eorq = eor ^ ((~eor) + 1);
    int a = 0;//因为 0^N == N 所以a可以初始化为0
    for (int i = 0; i < arr.length; i++) {
        if ((eorq&arr[i]) == 0) {
            a ^= arr[i];
        }
    }
    int b = eor ^ a;
    System.out.println(a);
    System.out.println(b);
}