异或讲解和一些应用

 1.概念

异或(XOR)是一种位运算符,通常用于计算机科学和编程中。

基本定义

异或运算符用符号 ^ 表示。对于两个二进制位,异或运算的规则是:

  • 如果两个位相同,结果为0。
  • 如果两个位不同,结果为1。

真值表

ABA^B
000
011
101
000

性质

  1. 自反性A ^ A = 0。任何数与自身异或的结果为0。
  2. 交换性A ^ B = B ^ A。异或运算具有交换性。
  3. 结合性(A ^ B) ^ C = A ^ (B ^ C)。异或运算具有结合性。
  4. 与0异或A ^ 0 = A。任何数与0异或的结果为该数本身。

使用场景:

1.交换俩个变量的值

想要交换俩个数可以采用异或方式(要求俩个数是独立的区域 可以是一个值但不能是同一个)

例:a=甲 b=乙

交换:

a=a^b

b=a^b 此时a=a^b 结果b=a

a=a^b 此时a=a^b b=a 结果a=b

此时 a=b,b=a,完成交换 这个方法省去了创建一个临时变量的空间 但不能是同一个变量否则结果始终为0。

2.判断俩个数是否相等

由于异或的性质,俩个数如果相等异或结果一定为0,不等异或结果不为0.

3.将变量清0

我们通过异或可以将变量与自己本身异或即可清0。

4.用于找特定数

问题1:一个整型数组中只有一个数字出现了奇数次,其他数出现偶数次,找出这个数字。

思路:由于异或的性质,我们不难想到将数组的所有数字异或一次所得的最终的结果就会是这一数字。

java代码实现

public class FindOddOccurrence {
    public static int findOdd(int[] arr) {
        int result = 0;
        for (int num : arr) {
            result ^= num;
        }
        return result;
    }

问题2:一个整型数组里除了两个数字出现奇数次之外,其他的数字都出现了偶数次次。请写程序找出这两个只出现一次的数字?

思路:把数组所有数进行异或,因为有俩个不同的数出现奇数次所以结果绝对不为0,那么找出结果位数为1的数,这俩个数的这个位数是不同的,所以我们把整个数组进行分组,一组这个位为0,一组这个位为1,在将俩个组进行分别对自己数组异或,可以得到俩个数结果

java代码实现
public class Main {
    public static void main(String[] args) {
        // 初始化数组,包含成对的数字和两个单独的数字
        int[] array = { 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10 };
        
        // 初始化两个数组,用于存储结果
        int[] array1 = new int[1];
        int[] array2 = new int[1];
        
        // 初始化异或结果
        int xorResult = 0;
        
        // 对数组中的所有数字进行异或运算
        for (int num : array) {
            xorResult ^= num;
        }
        
        // 找到异或结果中第一个为1的位
        int mask = 1;
        while ((xorResult & mask) == 0) {
            mask <<= 1;
        }
        
        // 初始化结果数组
        array1[0] = 0;
        array2[0] = 0;
        
        // 根据mask将数组中的数字分成两组,并分别进行异或运算
        for (int num : array) {
            if ((num & mask) == 0) {
                array1[0] ^= num;
            } else {
                array2[0] ^= num;
            }
        }
        
        // 找到结果 输出结果
        System.out.println(array1[0]);
        System.out.println(array2[0]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值