Excel CHOOSE 函數用法教學與範例
阿新 • • 發佈:2021-06-16
異或運算
異或運算:相同為0,不同為1同或運算:相同以1,不同為0
能長時間記住的概率接近0%
所以,異或運算就記成無進位相加!
性質:
- 0^N==N
N^N == 0
2)異或運算滿足交換律和結合律
題目:如何不用額外變數交換兩個數?
首先是兩個東西指的記憶體不一樣,和值相等不相等沒有關係。
a = a^b;
b = a^b;
a = a^b;
也可以寫成:
b = abb;
a = aba;
題目2:—個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎麼找到並列印這種數
將所有的數異或起來,偶數次的異或結果是0,其他異或出來的是那個出現奇數詞的陣列。
//arr中,只有一種數,出現奇數次 public static void printOddTimesNum1(int[] arr) { int eor = arr[0]; for(int i = 1;i<arr.length;i++) { eor ^= arr[i]; } System.out.println(eor); }
題目3:怎麼把一個int型別的數,提取出最右側的1來
N&(~N+1)
題目4:—個數組中有兩種數出現了奇數次,其他數都出現了偶數次,怎麼找到並列印這種數
package day1; import java.util.ArrayList; import java.util.List; //—個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎麼找到並列印這種數 public class Code8_EvenTimesOddTimes { //arr中,只有一種數,出現奇數次 public static void printOddTimesNum1(int[] arr) { int eor = arr[0]; for(int i = 1;i<arr.length;i++) { eor ^= arr[i]; } System.out.println(eor); } //arr中,有兩種數,出現奇數次 public static void printOddTimesNum2(int[] arr) { //笨拙的寫法 /* * a b 不相等 * eor不等於0 * 說明啊a^b一定有1 * 找到某一位是1 * 整個陣列分成兩大類,某一個是1的數,某一位不是1的數,迴歸上面問題 */ int eor = arr[0]; for(int i =0; i < arr.length ;i++) { eor ^= arr[i]; } //此時的eor就是a^b int t = eor & (~eor+1); List<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<Integer>(); //將陣列分類 for(int i = 0; i < arr.length;i++) { if((arr[i] & t) == t) { list1.add(arr[i]); } else { list2.add(arr[i]); } } int result1 = list1.get(0); int result2 = list2.get(0); for(int i = 1 ; i < list1.size();i++) { result1 ^= list1.get(i); } for(int i = 1 ; i < list2.size();i++) { result2 ^= list2.get(i); } //獲取結果 System.out.println(result1+" "+result2); } public static void printOddTimesNum3(int[] arr) { int eor = arr[0]; for(int i = 1;i<arr.length;i++) { eor ^= arr[i]; } /* * eor = a^b * eor != 0 * eor 必然有一個位置上是1 */ int rightOne = eor &(~eor+1); //提取出最右側的1 int onlyOne = 0; // 再遍歷一遍 for(int i = 0 ;i<arr.length;i++) { if((arr[i] & rightOne) != 0) { //等同於 = rightOne onlyOne ^= arr[i]; } } System.out.println(onlyOne+" "+(eor ^ onlyOne)); } public static void main(String[] args) { int[] arr = {3,3,2,3,1,1,1,3,1,1,1}; printOddTimesNum1(arr); int[] arr2 = {4,3,4,2,2,2,4,1,1,1,3,3,1,1,1,4,2,2}; printOddTimesNum2(arr2); } }
題目5:取出二進位制1的個數
package day1; //獲取二進位制中1的個數 public class Code9_Get1In0101 { public static int bit1counts(int n) { int count = 0; int rightOne = n & (~n +1); while(n != 0) { count++; n ^= rightOne; } return count; } public static void main(String[] args) { System.out.println(bit1counts(13)); } }