异或
是一种基于二进制的位运算,“^”为双目运算符。运算规则如下:
0^0 = 0,
1^0 = 1,
0^1 = 1,
1^1 = 0
总结起来就是一句话:同为0,异为1.
三大性质:
1.交换律:a ^ b=b ^ a;
2.结合律:(a ^ b) ^ c=a ^(b ^ c)
3.a ^ a=0; a ^ 0 =a;a ^ (-1)=~a;
总结:0异或任何数=任何数;1异或任何数=任何数取反;任何数异或自己=把自己置0
用途
1.交换两个数的位置(不需要使用第三方变量)
@Test
public void test(){
int a=9;
int b=8;
a=a^b;
b=b^a;
a=a^b;
System.out.println("a="+a+",b="+b);
}
2.快速判断出两个数的值是否相等
@Test
public void test5(){
//判断连个数的值是否相等
int b=12;
int c=12;
System.out.println((c^b)==0);
}
3.找出数组中只出现一次的数字,其它数字都出现了两次
@Test
public void test7(){
int[] arr={1,6,2,6,3,1,2,4,4};
int x=0;
for (int i = 0; i <arr.length ; i++) {
x^=arr[i];
}
System.out.println(x);
}
经典算法题:
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
@Test
public void dobuleNum(){
int N=1001;
int[] arr = new int[N];
for (int i = 0; i < arr.length -1; i++) {
arr[i]=i+1;
}
//最后一个数为随机数
arr[arr.length -1]= new Random().nextInt(N -1)+1;
Utils.print(arr);
int x=0;
for (int i = 1; i <=N-1 ; i++) {
x=(x ^ i);
}
for (int i = 0; i < N; i++) {
x=(x ^ arr[i]);
}
System.out.println("重复的值为:"+x);
}
异或运算在编程中有着独特的性质,如交换律、结合律和自我消去性。它常用于无额外空间交换两个数、判断数值相等及找出数组中唯一出现一次的数字。在算法题中,例如在一个包含1000个不同数字和一个重复数字的数组中,可通过异或运算找到那个重复的数字。
811

被折叠的 条评论
为什么被折叠?



