You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++位运算生成子集时i&(1<<j)!=0打印整数组而非子集问题

问题根因:C++运算符优先级规则

你遇到的问题本质是运算符优先级导致的运算顺序不符合预期:
C++中关系运算符!=的优先级高于位与运算符&,所以你写的i&(1<<j)!=0并不会按照你预想的「先计算i和1<<j的位与结果,再判断结果是否不为0」执行,实际的运算顺序是:

  1. 先计算(1<<j) != 0:只要j的取值在int类型合法位移范围内,1<<j的结果永远是非0值,所以这个表达式的结果恒为布尔值true,转换为整数就是1
  2. 再计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 19:51:03