C 之暴力演算法突破二進位制列舉子集(例項)

2021-12-30 01:20:04 字數 1376 閱讀 2813

給定乙個集合,列舉所有可能的子集。列舉子集的方法有很多,這裡介紹一種非常方便的列舉子集方法——二進位制法。

我們可以用二進位制的一位表示集合對應的某一元素的選取狀態,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...