算法 | 异或运算

异或运算

相同为0,不同为1

异或运算的性质

(1)0^N = N N^N = 0
(2)异或运算满足交换律和结合率

认识异或运算

1、如何不用额外变量交换两个数
2、一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
3、怎么把一个int类型的数,提取出最右侧的1来
4、一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数

1、如何不用额外变量交换两个数

int a = 15;
int b = 2;
        
a = a ^ b;
b = a ^ b;
a = a ^ b;
如何不用额外变量交换两个数.png

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);
}
一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数 .png

3、怎么把一个int类型的数,提取出最右侧的1来

int eor = 0;
int rightOne = eor &( (-eor)+1); // 提取出最右的1
怎么把一个int类型的数,提取出最右侧的1来.png

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

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

        int rightOne = eor & (-eor + 1); // 提取出最右的1
        
        
        int onlyOne = 0; // eor'
        for (int i = 0 ; i < arr.length;i++) {
            if ((arr[i] & rightOne) != 0) {
                onlyOne ^= arr[i];
            }
        }
        System.out.println(onlyOne + " " + (eor ^ onlyOne));
}
第2节.png

你可能感兴趣的:(算法 | 异或运算)