複習筆記7 位映射圖

public class Test8
{
	public static void main(String[] args)
	{
//		1.給定集合A{0,1,2.....30,31}
//		2.給定集合B{5,6....10,11}
//		3.求 A 和 B 的交集
//		4.求 A 和 B 的並集
//		5.求 B 相對於 A 的補集
//		6.求 A 對 B 差集
//		7.求給定集合 C{7,9} 是 A 和 B 哪個集合的子集,並實現任意集合子集的查詢功能
//		8.以上所有集合必須使用一個int表示而非數組,所有代碼均以按位運算符進行
//		9.使用查表法可以根據int表示的集合正確輸出該集合所表示的數組。
//		10.必須詳細寫出解題思路,實現方法。
		
		//首先考慮,如何使用int來保存一個集合,貌似很難,我們都知道
		//int表示的是一個數,表示集合怎麼表示?
		//先看集合A,0-31,是不是很眼熟?在哪裏見過?這不就是int的位移區間麼?
		//那麼是不是可以這樣,我們用一個數的位移次數來表示集合?關鍵是怎麼在一個
		//數中表示這麼多數的位移次數,而且還要保持這個數每一種位移次數的值不重複。
		
		//注意我這裏用的mask是java裏常見的掩碼,shift表示位移,以後看見源文件
		//中出現這些變量的名字就知道是做什麼的了
		
		//這裏邊打印了1的不同位移情況下的掩碼,我們可以想想,如果我拿沒一個掩碼
		//表示一個數,是不是形成一種映射關係?類似map的key 和 value,那麼這個
		//key是什麼?其實key就是掩碼,而這個value就是1到這個掩碼的位移次數。
		
		//看這個圖是不是眼前一亮,其實跟之前的位移那個圖差不多,一個是1,一個是-1
		int mask = 0;
		for (int shift = 0; shift < 32; shift++)
        {
	        System.out.println(getIntegerToBinary((mask = (1 << shift))));
        }
		System.out.println("======================================>");
		
		//下面做下嘗試,比如我們自己做一個012的集合
		//這裏我們得想下,一個空集,怎麼往裏邊加數據?前邊講過| ^ + 都行吧,
		//其實還是 | 好一些,其他的在某些情況下會有點小問題
		int set = 0;
		set = set | 1 << 0;
		set = set | 1 << 1;
		set = set | 1 << 2;
		//這裏發現我們成功了對麼?我們可以用最低位表示這個集合中有0對吧
		//而順序是什麼呢?從右往左每一位爲1表示有該位位移次數的這個數。
		//當然你如果喜歡從左往右也可以,呵呵,自己可以嘗試一下
		System.out.println(getIntegerToBinary(set));
		System.out.println("======================================>");
		
		//1第一點,我們就這麼做出來了,B 和 C 的話如法炮製,由於題目裏邊都是連續的數
		//咱就可以投機取巧了
		int A = 0, B = 0, C = 0;
		for (int shift = 0; shift < Integer.SIZE; shift++)
        {
			mask = 1 << shift;
			//注意這裏我爲什麼要12在前,4在後
			if((shift < 12) && (shift > 4))
				B |= mask;
			if((shift == 7) || (shift == 9))
				C |= mask;
	        A |= mask;
        }
		System.out.println(getIntegerToBinary(A));
		System.out.println(getIntegerToBinary(B));
		System.out.println(getIntegerToBinary(C));
		System.out.println("======================================>");
		
		//3,求 A 和 B 的交集,這個在Test7裏邊咱講了交集用什麼?
		System.out.println(getIntegerToBinary(A & B));
		System.out.println("======================================>");
		
		//4,求 A 和 B 的並集
		System.out.println(getIntegerToBinary(A | B));
		System.out.println("======================================>");
		
		//5,求 B 相對於 A 的補集
		//6, 跟 5 一樣
		System.out.println(getIntegerToBinary(A ^ B));
		System.out.println("======================================>");
		
		//7.求給定集合 C{7,9} 是 A 和 B 哪個集合的子集
		//這個檢查很簡單,先求交集,如果這個交集還是他
		//自己,那麼就是這個集合的子集
		System.out.println((C & A) == C);
		System.out.println((C & B) == C);
		System.out.println("======================================>");
		System.out.println(isChid(C, A));
		System.out.println(isChid(C, B));
		System.out.println("======================================>");
		
		System.out.print("A     ");printIntegerSet(A);
		System.out.print("B     ");printIntegerSet(B);
		System.out.print("C     ");printIntegerSet(C);
		System.out.print("A & B ");printIntegerSet(A & B);
		System.out.print("A | B ");printIntegerSet(A | B);
		System.out.print("A ^ B ");printIntegerSet(A ^ B);
		System.out.print("C & B ");printIntegerSet(C & B);
		System.out.print("C | B ");printIntegerSet(C | B);
		System.out.print("C ^ B ");printIntegerSet(C ^ B);
	}
	
	public static final void printIntegerSet(int set)
	{
		StringBuilder sb = new StringBuilder("Set{");
		int mask;
		for (int shift = 0; shift < Integer.SIZE; shift++)
        {
	        mask = 1 << shift;
	        if(mask == (set & mask))
	        	sb.append(digits[shift] + ",");
        }
		sb.deleteCharAt(sb.length() - 1);
		sb.append("}");
		System.out.println(sb.toString());
	}
	
	public final static int[] digits;
	static
	{
		digits = new int[Integer.SIZE];
		for (int i = 0; i < digits.length; i++)
        {
	        digits[i] = i;
        }
	}
	
	/**
	 * 求前一個集合是不是後一個集合的子集
	 * @return true表示是,false表示不是
	 */
	public static final boolean isChid(int arg0, int arg1)
	{
		return arg0 == (arg0 & arg1);
	}
	
	public static final String DEFAULT_INT_ZERO = "00000000000000000000000000000000";
	public static final String getIntegerToBinary(int value)
	{
		String binary = Integer.toBinaryString(value);
		int length = Integer.SIZE - binary.length();
		return DEFAULT_INT_ZERO.substring(0, length) + binary;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章