1. 程式人生 > 電腦技巧 >Excel CHOOSE 函數用法教學與範例

Excel CHOOSE 函數用法教學與範例

異或運算

異或運算:相同為0,不同為1同或運算:相同以1,不同為0
能長時間記住的概率接近0%

所以,異或運算就記成無進位相加!

性質:

  1. 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));		
	}
}