ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

异或运算

2021-09-12 15:33:53  阅读:163  来源: 互联网

标签:arr 运算 int number eor 异或


异或运算

异或运算实现数值交换

package dataStructuresAndAlgorithms;

public class BitOperation {
    public static void main(String[] args){
        int a = 2;
        int b = 3;

        a = a^b;  // a = 2^3 b = 3;
        b = a^b;  // a = 2^3 b = 2^3^3 = 2
        a = a^b;  // a = 2^3^2 = 3 b = 2
        System.out.println("a = "+a+ " b = "+b);
    }
}

其中:

​ 1、0 与任何数异或,得到数的本身,任何数和自身进行异或,得到0;

​ 2、数学的交换律和结合律适用于异或运算,即:a^b = b^a; a ^ b ^ c = a ^ ( b ^ c);

​ 3、这种交换方式的实现前提是,变量所指的地址必须不同,值可以相同;

注:异或运算可理解为不进为的二位运算,即:1+1 =0; 1+0 = 1;

异或面试题

1、数组中,有一种数出现的次数是奇数次,其余的都是偶数次,查找出这个数;

2、数组中,有俩种数出现的次数是奇数次,其余的都是偶数次,查找出这俩个数;

解:

1:

public static void getOddNumber(){
        int[] arr = {2,3,2,2,3,3,2,6,6,7,6,7,6};
        int eor = 0;
        for(int number:arr){
            eor = eor^number;
        }
        System.out.println(eor);
    }

运行结果:3

分析:异或运算满足交换律和结合律,与元素的异或顺序无关,将数组种,相同的元素交换到一起,即可获得:

{2,2,2,2,3,3,6,6,6,6,7,7}

出现次数为偶数的数字,经过异或运算,会成为0,剩余的元素即为出现次数为奇数的元素。

2:

//获取出现次数为奇数的俩个元素 a,b
    public static void getTwoOddNumber(){
        int[] arr = {3,3,4,6,6,8,7,7,7,8,8,8};
        int eor  = 0;
        /*
         * 异或运算完,此时:eor = a^b = 4^7
         * 即:eor != 0,
         * 可得: eor的二进制上,必有一个位置不为0
         * */
        for(int number:arr){
            eor = eor^number;
        }

        /*
         * ~eor: 为取反操作,列:eor = 100000011 则~eor = 011111100
         * ~eor+1: 例:~eor = 011111100 ,则: ~eor+1 = 01111101
         * eor & (~eor+1):与运算 例: eor & (~eor+1) = 11111111(同为1则为1.否则为0)
         * 此写法能够找出右边第一出现1的数
         * 现在已经找出 eor = a^b 上为1的位置
         * */
        int rightOne = eor & (~eor + 1);
        /*
        * 已经得出eor不为0的位置,进行与运算时,会自动将出现次数为偶数的元素消掉
        * 当数组元素与rightOne进行与运算时,出现为0或者1的数,即为a或者b
        * */
        int onlyOne = 0;
        for(int number : arr){
            if((number & rightOne) == 0){
                onlyOne ^= number;
            }
        }
        /*
        * 将已经得到的出现次数为奇数的一个数,与eor进行异或运算,即可得到另一个数
        * */
        int otherOnlyOne = eor^onlyOne;
        System.out.println("一个数为:"+onlyOne+" 另一个是:"+otherOnlyOne);
    }

运行结果:一个数为:4 另一个是:7

标签:arr,运算,int,number,eor,异或
来源: https://www.cnblogs.com/caijilin/p/15258235.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有