JAVA异或运算符_java位运算符详解

JAVA异或运算符_java位运算符详解目录目录性质应用举例其他用途示例异或是一种基于二进制的位运算,用符号XOR或者^表示,起运算法则是对运算符两侧数的每一个二进制位同值则取0,异值则取1.简单理解就是不进位加法,如1+1=0,0+0=0,1+0=1.性质1、交换律2、结合律(即(a^b)^c==a^(b^c))3、对于任何数x,都有x^x=0,x^0=x4、自反性AXORBXORB=

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

Jetbrains全系列IDE稳定放心使用

目录


异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个二进制位同值则取0,异值则取1.
简单理解就是不进位加法,如1+1=0,0+0=0,1+0=1.
For example: 3^5 = 6
转成二进制后就是 0011 ^ 0101 二号位和三号位都是异值取1 末尾两个1同值取零,所以3^5 = 0110 = 6

性质

1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A

异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。 例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) :
A=A XOR B (a XOR b)
B=B XOR A (b XOR a XOR b = a)
A=A XOR B (a XOR b XOR a = b)

例:

int a = 10, b = 5

a = a ^ b;

b = a ^ b;

a = a ^ b;

类似地,该运算还可以应用在加密,数据传输,校验等等许多领域。

应用举例

1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
解法一、显然已经有人提出了一个比较精彩的解法,将所有数加起来,减去1+2+…+1000的和。
这个算法已经足够完美了,相信出题者的标准答案也就是这个算法,唯一的问题是,如果数列过大,则可能会导致溢出。
解法二、异或就没有这个问题,并且性能更好。
将所有的数全部异或,得到的结果与1^2^3^…^1000的结果进行异或,得到的结果就是重复数。
但是这个算法虽然很简单,但证明起来并不是一件容易的事情。这与异或运算的几个特性有关系。
首先是异或运算满足交换律、结合律。
所以,1^2^…^n^…^n^…^1000,无论这两个n出现在什么位置,都可以转换成为1^2^…^1000^(n^n)的形式。
其次,对于任何数x,都有x^x=0,x^0=x。
所以1^2^…^n^…^n^…^1000 = 1^2^…^1000^(n^n)= 1^2^…^1000^0 = 1^2^…^1000(即序列中除了n的所有数的异或)。
令,1^2^…^1000(序列中不包含n)的结果为T
则1^2^…^1000(序列中包含n)的结果就是T^n。
T^(T^n)=n。
所以,将所有的数全部异或,得到的结果与1^2^3^…^1000的结果进行异或,得到的结果就是重复数。
当然有人会说,1+2+…+1000的结果有高斯定律可以快速计算,但实际上1^2^…^1000的结果也是有规律的,算法比高斯定律还该简单的多。

google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?

@Test
public void fun() {
int a[] = { 22, 38,38, 22,22, 4, 4, 11, 11 };
int temp = 0;
for (int i = 0; i < a.length; i++) {
temp ^= a[i];
}
System.out.println(temp);
}

解法有很多,但是最好的和上面一样,就是把所有数异或,最后结果就是要找的,原理同上!!


其他用途示例

这样可以实现不引人第三个变量实现交换,但是进行的计算相对第三个变量多,所以效率会低一些。
关于其他的方法还有:int a=5,b=10;
a=a+b; //a=15,b=10
b=a-b; //a=15,b=5
a=a-b; //a=10,b=5
但是这样做有一个缺陷,假设它运行在vc6环境中,那么int的大小是4 Bytes,所以int变量所存放的最大值是2^31-1即2147483647,如果我们令a的值为2147483000,b的值为1000000000,那么a和b相加就越界了。
事实上,从实际的运行统计上看,我们发现要交换的两个变量,是同号的概率很大,而且,他们之间相减,越界的情况也很少,因此我们可以把上面的加减法互换,这样使得程序出错的概率减少:
int a=5,b=10;
a -= b; //a=-5,b=10
b += a; //b=5,a=-5
a = b – a; //a=10,b=5
通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯引入第三变量的算法之后。
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a-=b”求出ab两点的距离,并且将其保存在a中;第二句“b+=a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a+=b”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。

感谢原创作者对知识的分享 转载地址

关于运算符,二进制,位移运算符和运算符的应用介绍的比较详细的博客

下面这两位博主也都写的很好
位运算符的应用1

位运算符的应用2

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

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

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


相关推荐

  • 在eclipse创建web项目的问题总结

    在eclipse创建web项目的问题总结eclipse 快捷键 1 alt shift r 可以查找在同一个类中相同的变量 2 ctrl shift r 可以搜索类名称一 关于 eclipse 创建 web 项目 servlet 不能初始化的问题同事用 tomcat 来管理自己写的一些应用程序 然后通过 sevlet 来初始化 由于对 web 开发好几个没写了 当初也没学好 所以当时我看到如下配置 只申明 servlet 没有 mapping 所

    2025年7月10日
    3
  • 香港主机空间搜索引擎会不收录吗_如何让搜索引擎搜到自己的网页

    香港主机空间搜索引擎会不收录吗_如何让搜索引擎搜到自己的网页最近在Q群里发现有几个群友在叫唤,“我的网站怎么还不收录啊,是不是百度屏蔽了香港空间?”,“香港空间是不是对SEO有影响?”。经过查看他们的网站,发现他们做的是小说站,所有小说都是通过采集器采集过来的。这样的内容百度能正常收录吗?        通过亲身验证,香港主机空间本身不存在搜索引擎不收录的现象,百度搜索引擎也没有屏蔽香港ip的谬论。只要主机空间稳定、高速访问,香港和国内的空间对SEO

    2022年10月15日
    3
  • 面试题 垃圾分类_前端垃圾回收机制面试题

    面试题 垃圾分类_前端垃圾回收机制面试题一、垃圾回收对象JVM运行时的数据区包括程序计数器、栈、堆、方法区、本地方法栈其中程序计数器、栈和本地方法栈是和线程绑定在一起的,当创建了线程,就会申请内存,当线程结束的时候,想关的内存就会被销毁。方法区主要是类对象,类加载的时候就会申请这里的内存,“类卸载”操作实际上是很少会涉及到的。因此,垃圾回收机制主要回收的对象就是堆,并且垃圾回收释放内存,实际上是在以对象为单位进行释放,因为内存的申请是以对象为单位进行申请的,当整个对象的内存都不在使用时,即没有引用指向这个对象时,就可以将其进行释放二、垃圾

    2022年10月13日
    8
  • int转long类型[通俗易懂]

    int转long类型[通俗易懂]一.将long型转化为int型,这里的long型是基础类型:longa=10;intb=(int)a;二.将Long型转换为int型的,这里的Long型是包装类型:Longa=10;intb=a.intValue();三.将int型转化为long型,这里的int型是基础类型:inta=10;longb=(int)a;四.将Integer…

    2022年6月6日
    303
  • File中createNewFile()和createTempFile()区别[通俗易懂]

    1、createTempFile():FilesampleDir=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+”/FMRecording”);mSampleFile=File.createTempFile(“FMRecording”,”.m4a”,sampleDir);主要的

    2022年4月11日
    264
  • js中document.getElementById()用法「建议收藏」

    js中document.getElementById()用法「建议收藏」dom标准里面的 获取当前文档中指定id的元素if(document.getElementById(“regjm”).value!=document.getElementById(“regjm1”).value){  alert(“提示:请输入有效的认证码”);  document.getElementById(“regjm1”).focus();  retur

    2022年7月15日
    26

发表回复

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

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