首页 > 解决方案 > 你能向我解释一下这个按位运算符的代码吗?

问题描述

void printPowerSet(char *set, int set_size) {

  unsigned int pow_set_size = pow(2, set_size);
  int counter, j;

  for (counter = 0; counter < pow_set_size; counter++) {
    for (j = 0; j < set_size; j++) {

      if (counter & (1 << j))
        cout << set[j];
    }
    cout << endl;
  }
}

我无法理解if (counter & (1 << j))这里的部分。这段代码如何给出 a 的子集set {a,b,c}

标签: c++bitwise-operators

解决方案


主循环从 0 迭代到 (2^set_size)-1。例如,如果集合中有三个元素,它将从 0 迭代到 7 ((2^3)-1)。如果你用二进制表示它,它将是:000、001、010、011、100、101、110、111。这些都是三元素集的子集(1 - 我们取元素,0 - 我们不拿着)。现在您只需要迭代并检查我们是否采用第 j 个元素(如果第 j 位等于 1)。最简单的方法是检查 (i & (2^j)) 是否等于非零值(& 是按位运算,如果两个数字都在这个位置上,则对于数字中的每个位置都返回 1一个点亮的位,在任何其他情况下为 0)。if 操作将 0 视为假,将正值视为真,因此如果第 j 位点亮,则该操作将返回 2^j 并且它将是一个真值,因此该元素将被带到该子集,


推荐阅读