【C++干货分享】集合 位运算
//笔记来源:
分享|从集合论到位运算,常见位运算技巧分类总结! - 力扣(LeetCode)
将整数集合用二进制形式表示:
long long s = 10000100100;//用二进制形式表示的一个整数集合
构造原理:第 i 位为1 <=> 整数集合s中含有元素 i
干货
- -1 的二进制表示是 111...1111
所以有 -1 & s = s
- 关于 sub - 1的解读
对于二进制数sub, sub - 1的二进制 相当于 将sub二进制的最低位的 1变成0,并将上述 1右边的所有0变成 1
原理: =
遍历集合的技巧
遍历所有非空子集
for(long long sub=s; sub; sub = (sub-1) & s)
{
// 解释:关于(sub-1) & s
//sub-1 可以每次将最低位的 1变成0,并将上述 1右边的所有0变成 1
//&s 的操作保证了结果中的元素必然仍然是s中的元素,即结果一定是s的子集
)
遍历所有子集(含空集)
long long sub = s;
do{
//
sub = (sub-1) & s;
}while(sub != s)