【知识积累】如何不用额外变量交换两个数

package com.example.demo.algorithm;

/**
 * @Description :
 * 如何不用额外变量交换两个数
 *
 *普通公式:
 * 异或运算:相同为0,不同为1
 * 同或运算:相同为1,不同为0
 * 超级公式:
 * 异或运算 = 无进位相加
 *
 * 异或运算的性质:
 * 1)、0^N=N N^N=0
 * 2)、异或运算满足交换律和结合律
 *
 * @Author : Darren
 * @Date : 2021 年 02 月 07 日 20:06:18
 * @since : 1.0
 */
public class J008_SwapVariable {

    public static void main(String[] args) {
        int maxSize = 100;
        int maxValue = 100;
        int[] arrays = J001_SelectSort.generateRandomArray(maxSize, maxValue);
        System.out.println("before: ");
        J001_SelectSort.printArray(arrays);
        swap(arrays, 0, arrays.length-1);
        System.out.println("end: ");
        J001_SelectSort.printArray(arrays);
    }

    /**
     * 两个变量交换不申请额外遍历
     * 注意:
     * 变量1和变量2必须不相等或者值相等内存地址不能相等,否则两个相同的变量异或会变成0
     *
     * @param arrays
     * @param var1 变量1
     * @param var2 变量2
     */
    public static void swap(int[] arrays, int var1, int var2){
        if (arrays == null || arrays.length < 2){
            return;
        }
        //var1 = 3 var2=4
        //第一行执行 var1 = 3^4 var2=4
        arrays[var1] = arrays[var1] ^ arrays[var2];
        //第二行执行 var1 = 3^4 var2=4^3^4=3
        arrays[var2] = arrays[var1] ^ arrays[var2];
        //第三行执行 var1 = 4 var2=3
        arrays[var1] = arrays[var1] ^ arrays[var2];
    }
}

 

Guess you like

Origin blog.csdn.net/axin1240101543/article/details/113757976