其他分享
首页 > 其他分享> > 体系--01---异或运算

体系--01---异或运算

作者:互联网

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


异或运算

前置知识

初级–01—二进制、位运算

初级–05— 取模运算转化为位运算、位运算进行加减乘除

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

num >> 6 相当于 num/64

认识异或运算

在这里插入图片描述

异或运算性质

在这里插入图片描述

题目1

在这里插入图片描述

	public static void swap (int[] arr, int i, int j) {
		// arr[0] = arr[0] ^ arr[0];
		arr[i]  = arr[i] ^ arr[j];
		arr[j]  = arr[i] ^ arr[j];
		arr[i]  = arr[i] ^ arr[j];
	}

注意: 保证上诉参数,i和 j 的地址值不一样

在这里插入图片描述

题目2

在这里插入图片描述

在这里插入图片描述

	// arr中,只有一种数,出现奇数次
	public static void printOddTimesNum1(int[] arr) {
		int eor = 0;
		for (int i = 0; i < arr.length; i++) {
			eor ^= arr[i];
		}
		System.out.println(eor);
	}

题目3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

eor & (-eor) 或者 eor & (~eor+1)

在这里插入图片描述

题目4

在这里插入图片描述
在这里插入图片描述
假设奇数次的数 是 a,b

  1. 数组循环异或得到结果 eor=a^b
  2. 提取 eor 最右测的1出来 作为rightOne
    (a和b ,其中有一个此位置 必然是1 ,另一个此位置必是0,不然亦或此位置不会是1)
  3. 数组循环异或此位置是1的数===>得到a 或者b
    (那么数组中,此位置是1的数,一定分2中,一种是数组出现了偶数次的,一种是a,或者是b)
  4. 通过上述 eor=a^b 找出,====>找出另一个奇数的数a,b的另一个数
   // arr中,有两种数,出现奇数次
    public static void printOddTimesNum2(int[] arr) {
      //步骤1
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        // a 和 b是两种数
        // eor != 0
        // eor最右侧的1,提取出来
        // eor :     00110010110111000
        // rightOne :00000000000001000
        
        // 步骤2  
        int rightOne = eor & (-eor); // 提取出最右的1

        // 步骤3
        int onlyOne = 0; // eor'
        for (int i = 0 ; i < arr.length;i++) {
            //  arr[1] =  111100011110000
            // rightOne=  000000000010000
            if ((arr[i] & rightOne) != 0) {
                onlyOne ^= arr[i];
            }
        }

        // 步骤4
        System.out.println(onlyOne + " " + (eor ^ onlyOne));
    }

题目5

在这里插入图片描述

异或运算–01—arr中,只有一种数出现了K次,其他数都出现了M次

标签:arr,01,题目,运算,eor,--,---,int,异或
来源: https://blog.csdn.net/weixin_48052161/article/details/122520917