異或運算:相同為0,不同為1
同或運算:相同以1,不同為0
異或運算就記成無進位相加!
1)0^N == N N^N == 0
2)異或運算滿足交換律和結合率
如何不用額外變量交換兩個數
/**
* a 與 b 交換數據 不使用中間變量
*/
public static void m1(){
int a=5;
int b=10;
a=a^b; //5^10
b=a^b; //5^10^10===>5
a=a^b; //5^10^5 ===>10
}
題目二
一個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎么找到並打印這種數
/**
* 數組中只有一個數出現奇數次 其他的是偶數次 找出這個數
*/
public static int m2(int []arr){
int eur=0;
for (int a:arr){
eur^=a;
}
return eur;
}
題目三
怎么把一個int類型的數,提取出最右側的1來
eur&((~eur)+1)
解釋:例如一個數是 0001 0001 0011
取反 1110 1110 1100
加1 1110 1110 1101
eur做與操作 0000 0000 0001
題目四
一個數組中有兩種數出現了奇數次,其他數都出現了偶數次,怎么找到並打印這兩種數
/**
* 數組中有兩個數出現奇數次 其他的是偶數次 找出這兩個數
*/
public static void m3(int []arr){
int eur=0;
for (int a:arr){
eur^=a;
}
int rigthOne=eur&(~eur+1); //找出右邊第一個1
int one=0;
//整個數組分成兩個部分 1個部分是在rigthOne位置是1 1個部分是0 所以將兩個奇數次的數分開
for (int i=0;i<arr.length;i++){
if ((arr[i]&rigthOne)!=0){
one^=arr[i];
}
}
int two=eur^one;
System.out.println("這兩個數是"+one+two);
}
題目五
如何計算一個數中有幾個1
public static void m4(int arr){
int count=0;
while(arr!=0){
int rigthOne=arr&((~arr)+1); //找出右邊第一個1
count++;
arr=arr^rigthOne; //還原 統計過的1 變成0
}
System.out.println(count);
}
