位运算求子集的理解

这篇博客探讨了如何使用JavaScript实现数组子集的生成。通过遍历二进制掩码,利用位运算筛选出数组中对应位置的元素,形成所有可能的子集。例如,对于数组[1, 2, 3],当mask为5时,可以得到子集[1, 3]。这种方法揭示了二进制与子集之间的数学关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var subsets = function(nums) {
    const ans = [];
    const n = nums.length;
    for (let mask = 0; mask < (1 << n); ++mask) {
        const t = [];
        for (let i = 0; i < n; ++i) {
            if (mask & (1 << i)) {
                t.push(nums[i]);
            }
        }
        ans.push(t);
    }
    return ans;
};

在这里插入图片描述
子集的个数为 2 n 2^n 2n。于是我们遍历从0到 2 n − 1 2^n-1 2n1遍历mask。遍历到每个mask就求对应的序列,再由序列得到数组的值。
比较难理解的就是由mask求序列。
举个例子,数组num为[1,2,3]。
在这里插入图片描述
当mask为5时,将mask(101)分别与001、010、100( 2 i 2^i 2i)做&。
101&001=001=1(对应位做&)
101&010=000=0
101&100=100=1
1即为true,所以取第1、3个数。
因为 2 i 2^i 2i中只有1位为1,只有mask中对应的位也为1,才能保证结果不为0。所以这一步就是筛选出mask中值为1的位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值