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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

异或运算符

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

6二进制为:0000 01107二进制为:0000 01116^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 110111010 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)
上一篇 2022年10月5日 下午12:46
下一篇 2022年10月5日 下午12:46


相关推荐

  • TCP连接的状态详解以及故障排查

    TCP连接的状态详解以及故障排查我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助。(总结网络上的内容)1、TCP状态了解TCP之前,先了解几个命令:linux查看tcp的状态命令:1)、netstat-nat查看TCP各个状态的数量2)、lsof-i:port可以检测到打开套接字的状况3)、sar-nSOCK查看tcp创建的连接数4)、tcpdump-iany…

    2022年6月20日
    116
  • Coze AI 智能体工作流配置与实战全指南

    Coze AI 智能体工作流配置与实战全指南

    2026年3月12日
    3
  • navicat 15 激活码【注册码】

    navicat 15 激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    45
  • java字符型常量可以改变_在JAVA语言中,下列正确的字符型常量是

    java字符型常量可以改变_在JAVA语言中,下列正确的字符型常量是在 JAVA 语言中 下列正确的字符型常量是答 9 智慧职教 引发 COVID 19 疾病的新冠病毒的核酸类型是 答 RNA 仍然是长期制约我国经济社会发展的关键性问题之一答 人口数量问题下列说法中正确的是 只有抑郁症的人才会有抑郁情绪对于负面情绪和事件保持一定的钝感力和忘却力是非常重要的抑郁情绪和焦虑情绪是有积极意义的焦虑是指对还未发生的事情的担忧答 抑郁情绪和焦虑情绪是有积

    2026年3月17日
    3
  • string转map_中将转业可以任省长吗

    string转map_中将转业可以任省长吗暴力的直接Map对象toString()存,后面取出是就是用再转换为MapString转Map:JSONObjectjsonobject=JSONObject.fromObject(str);rMap=(Map<String,Object>)jsonobject;但很多时候并不能直接将Map对象的toString()而是应该转换为JsonObject后再调用toString()后存入就正常了Map<String,Object>map=newHashMa

    2025年8月31日
    6
  • 读秒计时器_countdown怎么读

    读秒计时器_countdown怎么读CountDownTimertimer=newCountDownTimer(5*1000,1000){@OverridepublicvoidonTick(longmillisUntilFinished){tv.setText(“还剩”+millisUntilFinished/10…

    2026年1月19日
    3

发表回复

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

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