异或运算
两数交换
!!!注意两个数要是不同的地址才可以用异或
public static void sway(int[] arr,int i,int j){
if(i!=j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
找出出现奇数次的数
1.只有一个数出现奇数次
public static int findone(int[] arr){
int eor = 0;
for (int i : arr) {
eor = eor ^ i;
}
return eor;
}
2.两个数出现奇数次
public static int[] findtwo(int[] arr){
int[] res = new int[2];
int eor = 0;
for (int i : arr) {
eor = eor ^ i;
}
int rightone = eor & (~eor + 1);
int onlyone = 0;
for (int i : arr) {
if ((i & rightone) == 0){
onlyone ^= i;
}
}
res[0] = onlyone;
res[1] = eor ^ res[0];
return res;
}
!!! 如果想得到一个数最右边为1的位数:
int rightone = eor & (~eor + 1);