c++ - 你能向我解释一下这个按位运算符的代码吗?
问题描述
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}
?
解决方案
主循环从 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 并且它将是一个真值,因此该元素将被带到该子集,
推荐阅读
- terraform - Terraform:如何根据条件在模块中设置变量?
- sql-server - 在 SQL Server 中从时间开始处理数据库表
- multithreading - GDB 消息“尚未为线程局部变量分配存储空间”
- php - 如何根据下拉列表更新 Chart.js?
- azure - 逻辑应用中的天蓝色变量初始化
- python - Django 类方法没有装饰器
- ios - iOS:在 MKMapView 上,无法在 MKMapTypeStandard 和 MKMapTypeMutedStandard 类型之间切换
- apache-spark - InsertInto(tablename) 始终将 Dataframe 保存在 Hive 的默认数据库中
- ios - 在设备上运行 Flutter iOS 应用程序会引发“线程 1:信号 SIGABRT”错误并崩溃
- python - PermissionError:[Errno 13] 权限被拒绝:output.csv