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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea永2021.2激活码破解方法

    idea永2021.2激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    47
  • 三维浮雕软件 linux,做3D浮雕圆雕模型用哪个软件好?3Dcoat这款软件是不错的选择。…「建议收藏」

    三维浮雕软件 linux,做3D浮雕圆雕模型用哪个软件好?3Dcoat这款软件是不错的选择。…「建议收藏」#以下是我整理了这款软件的几个优点:优点1,先进的智能转化功能,可以把彩色的平面图片生成3D浮雕模型图,也可以把灰度图生成3D浮雕图,例如在木雕家具效果图设计行业,3DCAOT制作的家具设计贴浮雕效果图优点2,它有先进的局部精细化功能,特别是用于表面精细的浮雕类工艺品设计,可以在产品的表面制作各种效果的浮雕效果。优点3,用于3D扫描抄数的后期处理,修图,对于扫描文件的表面处理,精修等。优点4,指定…

    2025年9月14日
    7
  • 智能视频识别技术的发展现状「建议收藏」

    智能视频识别技术的发展现状「建议收藏」一、智能视频分析技术应用现状  作为强化视频监控系统应用的一门主要技术——视频智能分析技术,近几年一直得到业界的广泛的关注,其通过对视频内容的分析,将客户所关注的目标从监控背景中分离出来,按照目标的移动方向、速度、时间等参数和某些行为特征进行关联,从而达到主动监控防御的目的。按说这一技术的大规模推广应用对于提高当前治安监控系统的利用效率将起到很大的作用,但实际上却没有得到有效的推广,所谓“叫好不叫座”。笔者认为,造成这一现象的主要原因有以下几个方面:【您可以是大型系统集成商、可以是相关贸易的经销商.

    2022年4月30日
    77
  • Sublime Text 3 注册/激活方法

    Sublime Text 3 注册/激活方法Sublime是一款很好用的编辑器,虽然是免费使用,但是经常会弹出吆喝着让你购买(purchase)的弹窗,对一名优秀的强迫症来说看久了还是很烦人的。而且现在网上很多注册码都不可用。那么要怎么解决呢?下面提供两种解决方案。(我是在win10系统上操作的)二、方案方案一[1]1)建立一个bat文件(随便取个名字,如“runHost.bat”),复制以下代码到…

    2022年7月27日
    8
  • FLAG_ACTIVITY_NEW_TASK谨慎使用「建议收藏」

    FLAG_ACTIVITY_NEW_TASK谨慎使用「建议收藏」前段时间在适配android权限的时候,遇到一问题1::在Activity的onCreate中去申请权限2:对申请结果进行判断,如果全部拒绝了权限,则弹出退出或者是去设置中打开权限其中点击设置中打开权限的时候启动activity时添加NEW_TASKTAG.并且对返回结果进行判断,如果仍然没有权限的时候,程序直接finish结果用户点击了设置-权限,去打开或者关闭权限,并且按back键返回后,a…

    2022年10月6日
    4
  • sql server下载安装步骤(sql2005安装教程图解)

    sql server下载安装步骤(sql2005安装教程图解)SQLServer2017下载安装教程第一步:打开浏览器,在浏览的搜索框中我们输入“SQLServer”。如图,会匹配出中文两条微软官方下载页面(一个页面内容是英文、一个页面内容是中文)。这里我们以中文的为例。第二步:点击进入下载页面后,可以看到如图所示页面,我们不要着急点击下载,因为这些SQLServer只能试用180天(大家从介绍中可以看到)。第三步:我们将网页下滑,可以看到…

    2022年4月18日
    418

发表回复

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

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