一、数据两个数做交换

    出现位置:P2认识复杂度和简单排序算法

    1、异或可以视为无进位的加法。
    2、性质
    image.png

    3、两个数做交换

    1. public static void swap(int[] arr, int i, int j){
    2. arr[i] = arr[i] ^ arr[j];
    3. arr[j] = arr[i] ^ arr[j];
    4. arr[i] = arr[i] ^ arr[j];
    5. }

    原理:
    用交换律和结合律 进行分析
    image.png
    注意:
    这是一种 抖机灵的写法, a 和 b的内存地址是两块东西。
    i 和 j 不能相同,如果相同就变成了0;

    二、
    image.png
    找数据中出现奇数次的数字。
    (1)在一个整形数组中,只有一个数出现了奇数次,其他数都出现了偶数次,找到出现奇数次的数
    (2)变成两个数出现了奇数次,找到这两个数
    要求时间复杂度 O(N), 空间复杂度O(1)
    image.png
    第一问: 全部异或,根据交换律和结合律就能分析出,最后结果就是这个数
    第二问:如果能变成第一问就能找到这个数,
    step1 : 先整体异或,异或和 等价于 两个目标值的异或,
    step2 :因为两个值不同,所以异或和肯定不为0,找到一个二进制为1 的位置, 说明这两个数在二进制形式上此位置是不同的值,
    step3 : 然后全员根据这个位置进行划分,分成两个集合,分别包含这两个目标值,其他的干扰项都是出现偶数次的数,分别在上边做异或和求得目标值
    image.png
    image.png
    tips: 如何获得一个数字二进制最右边的1?
    num &( ~num+1)上面代码第24行。
    image.png
    拓展:异或结果中某一位的跟这一位的奇偶频次有关。
    无进位相加。
    image.png