給定乙個集合,列舉所有可能的子集。列舉子集的方法有很多,這裡介紹一種非常方便的列舉子集方法——二進位制法。
我們可以用二進位制的一位表示集合對應的某一元素的選取狀態,1表示選取,0表示未選取。
舉個栗子呢,我們擁有乙個集合。那麼二進位制0101101就代表集合,具體如下:
2進製位數
6
5
4
3
2
1
0
二進位制數值
0 10 1
1 0 1
選取的元素
- 5- 3
2 - 1
**中對於二進位制的處理可以用位運算來實現。位運算是對二進位制的每一位進行計算,所以每一位只有 0 或 1 兩種可能。先介紹三種常用的位運算子:與&、或|、異或^,運算規則如下表所示。
a b
a與ba或b
a異或b
0 00 0 0
01 0
1 1
1 00 1 1
11 1
1 0與運算:兩者都為 1 時,結果即為 1,否則為 0。
或運算:兩者都為 0 時,結果即為 0,否則為 1。
異或運算:是兩者同為 0或 1 時,結果即為 0,否則為 1。
兩個十進位制整數進行位運算結果是多少呢?舉個例子a = 25與b = 14做位運算,a轉化為二進位制是11001,b轉化為二進位制是01110,那麼如下圖。
a=2511
00
1 b=14
0 11 1 0
a與b0 1
0 0 0
a或b1 1
1 1 1
a異或b
1 01 1 1
一定要注意,不要把a^b當成了a的b次方。
位運算子中有兩種操作,左移。右移具體還分為帶符號右移與無符號右移,本節我們提到的右移指的是帶符號右移,無符號右移使用較少,在這裡不做解釋。
對於a << b,表示把a轉化為二進位制後向左移動b位(在末尾新增b個0)。
對於a >> b,表示把a轉化為二進位制後向右移動b位(刪除末尾的b位)。
比如2 << 2,2轉化為二進位制則是10,那麼就是10左移動2位,就變成了二進位制1000,轉化為十進位制是8,所以2 << 2 = 8(2*2^2=8)。
二進位制列舉子集
利用二進位制的 開關 特性列舉 詳細為 如果給定集合a大小為n,則想象a 的每乙個元素相應乙個開關位 0或1 0表示不出現,1表示出現。當每乙個元素的開關位的值確定時,就得到乙個子集。因此共同擁有2 n 1種情況 全0為空集,這裡不考慮 我們利用區間 1,2 n 1 該區間上的每乙個整數相應乙個子集...
二進位制列舉演算法
列舉演算法相信大家都不陌生,有一種特殊的列舉演算法 二進位制列舉 為什麼要使用二進位制列舉演算法?因為有的時候很難用迴圈把所有的情況都表示出來,二進位制就可以很輕鬆的解決這個問題。話不多說,看題目吧。1.話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗。他邊走邊...
二進位制列舉演算法
二進位制 是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的數。它的基數為2,進製規則是 逢二進一 借位規則是 借一當二 子集 是乙個數學概念 如果集合a的任意乙個元素都是集合b的元素,那麼集合a稱為集合b的子集。含有n個元素的集合的一切子集的個數為 2 n。簡單證明一下 含有0...