C ++中有趣的位掩码拼图

时间:2012-04-24 18:49:54

标签: c++ binary redis puzzle bitmask

我有一个有趣的位掩码拼图问题,我需要帮助解决某些问题。这是问题所在:

11010

每个位代表一段内容的特征。它存储在Redis中。但是要查询它,我们需要每个组合,以便我们可以提取密钥。所以11010会产生这些组合:

11010
10000
10010
11000
01010
00010
01000

任何人都有C ++解决方案吗?

2 个答案:

答案 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 =位设置)大于您拥有的键数,则可能更快地反转问题。也就是说,获取密钥列表并根据位掩码测试它们,而不是枚举可能的密钥并检查值。