C++位运算生成子集时i&(1<<j)!=0打印整数组而非子集问题
问题根因:C++运算符优先级规则
你遇到的问题本质是运算符优先级导致的运算顺序不符合预期:
C++中关系运算符!=的优先级高于位与运算符&,所以你写的i&(1<<j)!=0并不会按照你预想的「先计算i和1<<j的位与结果,再判断结果是否不为0」执行,实际的运算顺序是:
- 先计算
(1<<j) != 0:只要j的取值在int类型合法位移范围内,1<<j的结果永远是非0值,所以这个表达式的结果恒为布尔值true,转换为整数就是1 - 再计算
i & 1:此时判断条件等价于只检查i的最低位是否为1,和你原本要检查「i的第j位是否为1」的逻辑完全不匹配。当i最低位为1时,所有j对应的判断条件都为真,就会打印整个数组。
修复方案
两种写法都可以解决问题:
- 给位与运算添加括号明确运算优先级:
if( (i & (1 << j)) != 0 ) - 直接利用C++中非0整数等价于布尔值
true的规则,省略显式的!=0判断,也就是你测试可正常运行的写法:if( i & (1 << j) )
修复后完整代码
#include <iostream> using namespace std; void subsets(int arr[], int n) { for(int i = 0; i < (1 << n); i++){ for(int j = 0; j < n; j++) { // 加括号明确运算顺序的写法 if( (i & (1 << j)) != 0 ) { cout << arr[j] << " "; } } cout << endl; } } int main() { int arr[3] = {1,2,3}; subsets(arr, 3); return 0; }
内容的提问来源于stack exchange,提问作者Ishan Khandelwal
相关产品推荐
相关产品推荐

