這裡有如下知識點:
(1)>>代表二進位制右移一位,即:最前面的那位變成0,最後面的那位被「乾掉」
(2)《代表二進位制左移一位,即:在最後麵加乙個0,前面的序列不變
(3)&運算子:對於運算的兩個數,只有當對應位均為1時該位的運算結果等於1,否則該位的運算結果為0
(4)(x>>0) & 1可以取出x的最後一位(二進位制) => 推廣:(x>>i) & 1可以取出x的從二進位制右邊數的第i+1位
(5)(1>>n) - 1為二進位制下的11111....11111(n個1)
由此,我們將x從00000...000(n個)到111111...111遍歷,每次不斷地取出x的所有位。若該位上的數字為1,則代表取出集合s中對應位置的元素並加入子集,否則不取。
c++ **如下:
#include #include using namespace std;
sets;
int a = ;
int main()
for (auto it : s)
cout << it << " ";
cout << endl;
}return 0;
}
當然,也可以直接列舉0-1序列:
#include using namespace std;
int a = ;
int main()
cout << endl;
}return 0;
}
列舉集合所有子集。
列舉集合所有子集。包括空集與該集合本身,共2的n次方個。列舉集合所有子集。包括空集與該集合本身,共2的n次方個。include include using namespace std template void print elements t array,unsigned int count,un...
列舉乙個集合的所有子集
數字範圍是0 9,即集合元素在10個及以下 ifndef subset h define subset h class subset endif subset h include include subset.h using namespace std int main array1.find su...
利用位運算求子集
紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...