一、^
1、简介两个数做^ 变为二进制 相同的的变为0 不同的变为1
例如: 10010 ^ 10000 -> 00010
2、性质
0^n=n;
n^n=0
满足交换律和结合律
交换两个数
int a=甲 int b=已
a=a^b a变成甲^乙
b=a^b 甲^乙^乙=甲
a=a^b 甲^乙^甲=乙
3、常见考点
1、找出一个数组中一种数出现了奇数次,其余全是偶数
直接让数组全部异或运算,最后结果就是这个数
2、找数组中两个数是奇数个的数
假设这两个数分别是a,b
首先让数组全部异或运算,得到e=a^b
然后用上面的结合计算把e最右侧1取出来 记作w
在这个位置上,a,b两个数肯定一个是1,一个是0
然后遍历数组和w&运算,因为w只有一位为1,其余为0,
public void find(int []arr){
int eor=0;
for(int i=0;i<arr.length;i++){
eor=eor&arr[i];
}
//eor=a^b 且!=0
//取出最右边的1
int rightone=eor&(~(eor)+1);
int onlyone=0;
for(int i=0;i<arr.length;i++){
if((arr[i]&(rightone))!=0){
onlyone=onlyone^arr[i];
}
}
System.out.println(onlyone+" "+(eor^onlyone));
}
二、&
1、性质
同时为1才取1 取出第i位的数字 int u=x>>i&1
a&-a可以得到最右边的1
2、例题
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for(int i=0;i<n;i++){
int sum=0;
int x=in.nextInt();
while(x>0){
int a=method(x);
x=x-a;
sum++;
}
System.out.print(sum+" ");
}
}
public static int method(int a){
return a&(-a);
}
}