java - 对这段计算幂集的代码如何工作感到困惑

标签 java

我在 geeksforgeeks 上找到了这个函数,用于查找给定集合的所有子集。我只是不确定嵌套 for 循环中的 if 语句正在检查什么。我知道它使用按位 AND 运算符,但我对它如何帮助了解在任何迭代期间包含或不包含哪些元素感到困惑。

import java.io.IOException; 

public class Main 
{ 
    // Print all subsets of given set[] 
    static void printSubsets(char set[]) 
    { 
        int n = set.length; 

        // Run a loop for printing all 2^n 
        // subsets one by obe 
        for (int i = 0; i < (1<<n); i++) 
        { 
            System.out.print("{ "); 

            // Print current subset 
            for (int j = 0; j < n; j++) 

               //???what is this checking?????
                if ((i & (1 << j)) > 0) 
                    System.out.print(set[j] + " "); 

            System.out.println("}"); 
        } 
    } 

    // Driver code 
    public static void main(String[] args) 
    { 
        char set[] = {'a', 'b', 'c'}; 
        printSubsets(set); 
    } 
} 

最佳答案

如果幂集中有三个项目,则有 2^3 种组合。

a, b, c
===
[]
[a]
[b]
[a, b]
[c]
[a, c]
[b, c]
[a, b, c]

您会注意到,这遵循二进制模式,其中每个位都与集合中的一个元素相匹配。如果位是 0然后从结果中删除元素。

a, b, c
===
[0, 0, 0] -> [0*a, 0*b, 0*c] = []
[1, 0, 0] -> [1*a, 0*b, 0*c] = [a]
[0, 1, 0] -> [0*a, 1*b, 0*c] = [b]
[1, 1, 0] -> [1*a, 1*b, 0*c] = [a, b]
[0, 0, 1] -> [0*a, 0*b, 1*c] = [c]
[1, 0, 1] -> [1*a, 0*b, 1*c] = [a, c]
[0, 1, 1] -> [0*a, 1*b, 1*c] = [b, c]
[1, 1, 1] -> [1*a, 1*b, 1*c] = [a, b, c]

if ((i & (1 << j)) > 0)用于检查位以过滤结果。

关于java - 对这段计算幂集的代码如何工作感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54701673/

相关文章:

java - 处理多个 PCollection 输出时找不到编码器

java - 如何更改所有设备的用户 session 状态(离开、dnd 等)

java - twitter4j 突然停止工作

java - Swagger 1.5 不显示我的 1.2 的 @Api 描述?

java - 如何将 Kotlin 源文件转换为 Java 源文件

java - ResultSet 关闭后不允许进行操作。原因

java - 我疯了吗?将已建立的产品从 HSQLDB 切换到 Apache Derby

java - Android - 从 Fragment 中设置 BottomSheet 中 FAB 按钮的可见性

Java:如果 doOutput=false,则无法写入 URLConnection - 调用 setDoOutput(true)

java - 如何从输入流中重新打开文件