Java^异或运算符应用

3 篇文章 0 订阅
2 篇文章 0 订阅

Java^异或运算符应用

异或运算符的使用场景和说明

package com.cn.study;

/**
 * 按位操作符,应用
 */
public class BitOpreationApply {
    /**
     * 互换两个变量的值,满足最低的空间复杂度.
     * 示例:a = 5, b = 3
     * 第一步:a = a ^ b; 6 = 5 ^ 3; 0101 异或 0011 = 0110
     * 第二步:b = a ^ b; 5 = 3 ^ 6; 0011 异或 0110 = 0101
     * 第三步:a = a ^ b; 3 = 6 ^ 5; 0110 异或 0101 = 0011
     * 结果:a = 3; b = 5
     * 证明:
     * a1 = a ^ b
     * b1 = a1 ^ b --> b1 = (a ^ b) ^ b 且 a ^ b ^ b = a ^ 0 = a
     * b = b1 --> b = (a ^ b) ^ b
     * a2 = a1 ^ b1 --> a2 = a ^ b ^ ((a ^ b) ^ b)
     * a = a2 -- > a = (a ^ b) ^ ((a ^ b) ^ b) = a ^ b ^ a ^ b ^ b = b // 两个相同的值异或值为0,a ^ 0 的值为 a(自然数)
     * @param a
     * @param b
     */
    public static void test(int a, int b) {
        System.out.println("初始值:a = " + a + "; b = " + b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("互换后值:a = " + a + "; b = " + b);
    }

    /**
     * 获取数组中不重复数字。假设数组中非重复值,仅有一个。满足最低的空间复杂度
     * 根据上个函数结论:两个相同的值异或值为0,a ^ 0 的值为 a(自然数)。可以使用^运算符解决。
     * @param nums 数组
     * @return 唯一数
     */
    public static int test1(int[] nums) {
        int a = 0;
        for (int num : nums) {
            //System.out.println("a1:" + a);
            a = a ^ num;
            //System.out.println("a2:" + a);
        }
        return a;
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 5, 2, 3};
        /** 相同位的两个数字对应的二进位相异时,结果为1。
         * 循环1: 2 = 0 ^ 2 ==> 0000 异或 0010 = 0010
         * 循环2: 1 = 2 ^ 3 ==> 0010 异或 0011 = 0001
         * 循环3: 4 = 1 ^ 5 ==> 0001 异或 0101 = 0100
         * 循环4: 6 = 4 ^ 2 ==> 0100 异或 0010 = 0110
         * 循环5: 5 = 6 ^ 3 ==> 0110 异或 0011 = 0101
         *
         * 如何理解?
         * 两个相同的值异或值为0,a ^ 0 的值为 a(自然数)。
         */
       System.out.println(test1(nums));


        test(5, 3);

    }

}

运行结果:

5
初始值:a = 5; b = 3
互换后值:a = 3; b = 5

结论

^ 运算符的使用虽然不多。但在理解其原理后在平常代码中还是可以做一些应用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值