如何解决您能向我解释一下按位运算符的代码吗?
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))
部分。这段代码如何提供set {a,b,c}
的子集?
解决方法
主循环从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视为错误,将正值视为true,因此,如果第j个位点亮,则该操作将返回2 ^ j并且它将为true值,因此此元素将被带到此子集,否则,如果位未点亮,操作将返回0,因此该元素不在此子集中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。