我有一个有趣的位掩码拼图问题,我需要帮助解决某些问题。这是问题所在:
11010
每个位代表一段内容的特征。它存储在Redis中。但是要查询它,我们需要每个组合,以便我们可以提取密钥。所以11010
会产生这些组合:
11010
10000
10010
11000
01010
00010
01000
任何人都有C ++解决方案吗?
答案 0 :(得分:4)
请参阅Chess Programming Wiki以获取与初始位掩码的子集数量成线性关系的算法。当n位设置为1时,该数字等于2 ^ n,因此它是设置位数的指数。
// enumerate all subsets of set d
void enumerateAllSubsets(U64 d) {
U64 n = 0;
do {
doSomeThingWithSubset(n);
n = (n - d) & d;
} while ( n );
}
答案 1 :(得分:1)
如果2 ^ n(n =位设置)大于您拥有的键数,则可能更快地反转问题。也就是说,获取密钥列表并根据位掩码测试它们,而不是枚举可能的密钥并检查值。