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);
    }

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 一二三型观测线的图片_拓扑图

    一二三型观测线的图片_拓扑图“您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。比荷卢经济联盟有很多公交线路。每天公共汽车都会从一座城市开往另一座城市。沿途汽车可能会在一些城市(零或更多)停靠。旅行社计划旅途从 S 城市出发,到 F 城市结束。由于不同旅客的景点偏好不同,所以为了迎合更多旅客,旅行社将为客户提供多种不同线路。游客可以选择的行进路线有所限制,要么满足所选路线总路程为 S 到 F 的最小路程,要么满足所选路线总路程仅比最小路程多一个单位长度。如上图所示,如果 S=1,F=5,则这里有两条最短路线 1→

  • FileInputStream读取文件数据的两种方式

    FileInputStream读取文件数据的两种方式FileInputStream(文件字节读取流):read():一个一个字节的读read(byte[]buf):先把字节存入到缓冲区字节数组中,一下读一个数组(常用)importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava….

  • 超分辨率重建开山之作——SRCNN

    论文及代码地址:http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html)基于卷积神经网络的影像超分辨率重建摘要:我们提出了一种基于深度学习的单影像超分辨率重建方法。我们直接以端对端的方式学习高…

  • C#递归算法总结_c++递归算法

    C#递归算法总结_c++递归算法递归数组是啥?1,1,2,3,5,8,13,21,……当这样一组数字出现在你面前,如果接触的少,或者像我这样学过就忘了的人,一下还真反应不过来它的规律,实际上就是F(n)=F(n-1)+F(n-2);然后面试会遇到这么一个题,要求写一个函数(方法),只输入一个参数intindex,要求输出数组内下标为index与其之前的数之和。publicintarr(intindex){if(index==1||index==2){return1;

    2022年10月23日
  • flashfxp3.41中文版注册码:(适合最新版本)

    flashfxp3.41中文版注册码:(适合最新版本)推荐(尚未被封的Realkey)FLASHFXPvACq2ssbvAAAAAC1W7cJKQTzmx77zmqJICvA7d3WnUtWNXdrp8YuERRFdIvXfOPbcpABkVix2aRTgg6afcIKFPxS72XYljdE9tgQD/2r+kmfVBngGM4Qc9p7e0PcTfFF/1tt2bqlxS8r0L7z0jrqb5NSiPr…

  • try catch的作用

    try catch的作用trycatch的作用:当程序发生错误时,能够保证程序继续执行下去。用一个简单例子说明:1:无trycatchpublicstaticvoidmain(String[]args){ inti; i=2/0; System.out.println(i); System.out.println(1111111111); }运行结果:不会输出1111111112:有tr…

发表回复

您的电子邮箱地址不会被公开。

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