java异或运算符号_java异或运算符使用场景

java异或运算符号_java异或运算符使用场景异或运算符“^”是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.异或运算符可认为是无进位的二进制相加,如:6^7如6二进制为:00000110如7二进制为:00000111则6^7=1异或运算符性质(1)0^N=N;N^N=0(2)满足交换律及结合律简单的算法题(1)如果一个数组中只有一个数出现了奇数次,剩下的数都出现了偶数次,求这个出现了奇数次的数。publicstaticvoidgetData(int[]arr){int


Jetbrains全系列IDE稳定放心使用

异或运算符

“^” 是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.
异或运算符可认为是无进位的二进制相加,如:6^7

如6二进制为:0000 0110
如7二进制为:0000 0111
则6^7=1

异或运算符性质

(1)0^N=N; N^N=0
(2)满足交换律及结合律

简单的算法题

(1)如果一个数组中只有一个数出现了奇数次,剩下的数都出现了偶数次,求这个出现了奇数次的数。

public static void getData(int[] arr) { 
   
        int eor=arr[0];
        for (int i=1;i<arr.length;i++){ 
   
            eor^=arr[i];
        }
        System.out.println(eor);
    }

利用N^N=0性质,则所有出现偶数次的数异或结果都为0,遍历数组将所有的数异或,得到的结果即为出现奇数次的数。
(2)如果一个数组中有两个数出现了奇数次,剩下的数都出现了偶数次,求这两个出现了奇数次的数。

 public static void getDatas(int[] arr) { 
   
        //怎么把一个整型的数提取出最右侧的1
        // N N&((~N)+1)
        int eor=0;
        for (int i=1;i<arr.length;i++){ 
   
            eor^=arr[i];
        }
        int rightOne=eor&(~eor+1); //提取出最右侧的1
        int onlyOne=0;
        for (int i=0;i< arr.length;i++){ 
   
            if ((arr[i]&rightOne)!=0){ 
   
                onlyOne^=arr[i];
            }
        }
        System.out.println(onlyOne+" "+(eor^onlyOne));
    }

假设出现奇数次的两个数分别为a,b.
1.第一次遍历数组,将所有数异或后的结果即为两个出现了奇数次的数异或的结果,即eor=a^b
2.将一个数按位取反,再加1,并和它本身相与,得到的是这个数最右侧出现1的位置。

一个数:  0101 0000 1111 0010
~:      1010 1111 0000 1101
加1:    1010 1111 0000 1110
&:      0000 0000 0000 0010

即rightOne求出这两个数在右侧某一位上是1,两个数异或在这一位上为1,即证明a和b,这两个数在这一位上不同,即其中一个在这一位上为0.
3.(arr[i]&rightOne)!=0 得到的是数组中在这一位上为1的数。
4.第二次遍历,将数组中在这一位上为1的所有的数相异或,得到的结果即为,在这位上为1,且出现了奇数次的那个数onlyOne。
5.已知异或的结果,已求出其中一个出现奇数次的数,则另一个出现奇数次的数为eor^onlyOne.

(3)如何不用额外变量就交换两个数的值?

 public static void swap(int a,int b) { 
   
        a=a^b;
        b=a^b;
        a=a^b;
        System.out.println(a);
        System.out.println(b);
    }

异或运算可实现两个变量值交换,但两个变量必须指向不同的内存空间。如果两个变量指向同一个内存空间,则会报错;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185706.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • MFC文件操作

    文件操作:二进制文件和文本文件的区别。二进制文件将数据在内存中存在的模式原封不动的搬到文件中,而文本文件是将数据的asc码搬到文件中。首先做一个读写文件的菜单,在CxxView里响应1.C的方式:fw

    2021年12月26日
  • kafuka 的安装以及基本使用

    kafuka 的安装以及基本使用最近因为项目需要所以需要使用kafka所以自己最近也实践了下。下面为大家简单介绍下在windows下的安装使用因为它是基于zookepper的使用也要安装zookepper1.安装ZookeeperKafka的运行依赖于Zookeeper,所以在运行Kafka之前我们需要安装并运行Zookeeper1.1下载安装文件:http://mirror.bit.edu.cn/apache…

    2022年6月11日
  • Java 四种线程池的用法分析

    Java 四种线程池的用法分析介绍newThread的弊端及Java四种线程池的使用,对Android同样适用,本文是基础篇。转载请标注原地址:http://blog.csdn.net/u011974987/article/details/51027795;1、newThread的弊端执行一个异步任务你还只是如下newThread吗?newThread(newRunnable(){@Override

    2022年7月8日
  • loadrunner11如何使用java Vuser运行java代码及设置环境变量和上传jdk

    loadrunner11如何使用java Vuser运行java代码及设置环境变量和上传jdk

    2021年7月17日
  • 从零开始学习UCOSII操作系统4–任务管理

    从零开始学习UCOSII操作系统4–任务管理从零开始学习UCOSII操作系统4–任务管理1、重讲任务(1)任务可以是一个无限的循环,也可以在一次执行完毕后被删除。这里需要注意的是,任务的代码并不是真正的删除了,而是UCOSII不再理会该任务代码,所以该任务代码不会再执行。(2)建立任务,OSTaskCreate()如果想让UCOSII管理用户的任务,必须先建立任务,可以通过将任务的地址(函数名)和其他参数传递到

    2022年5月24日
  • ubuntu下安装mysql_智聊aqq下载安装

    ubuntu下安装mysql_智聊aqq下载安装谢天谢地,谢计算机大佬,在ubuntu下搞出qq,没QQ,办公还真是不行,虽然有其它的传输方式,但没那么方便呀"。先安装wine,三条指令,注意:不是安装源默认的wine(aptinstallwine)不是这个。sudoadd-apt-repositoryppa:wine/wine-buildssudoapt-getupdatesudoapt-getinstallwinehq…

    2022年9月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号