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;
}
}
複習筆記7 位映射圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.