Java 对计算powerset的代码的工作原理感到困惑

Java 对计算powerset的代码的工作原理感到困惑,java,Java,我在Geeksforgeks上找到了这个函数,用于查找给定集合的所有子集。我只是不确定嵌套for循环中的if语句正在检查什么。我知道它使用的是按位AND运算符,但我不知道它如何帮助知道在任何迭代过程中包括或不包括哪些元素 import java.io.IOException; public class Main { // Print all subsets of given set[] static void printSubsets(char set[])

我在Geeksforgeks上找到了这个函数,用于查找给定集合的所有子集。我只是不确定嵌套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); 
    } 
} 
import java.io.IOException;
公共班机
{ 
//打印给定集合的所有子集[]
静态void打印子集(字符集[])
{ 
int n=设置长度;
//运行循环以打印所有2^n
//obe的一个子集

对于(inti=0;i<(1只需考虑i在位级别的排列

如果n=3的情况

0 1 1
1 0 1 
i=0

是安排

i=3

是吗

i & (1<<j) > 0  
只能拾取j=0,1

如果i=5的情况下

0 1 1
1 0 1 
是安排

然后只能选择j=0,2

经过上述过程的i 0…7


您可以获得所有的powerset!

如果一个powerset中有三个项目,则有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&(10)
用于检查位以过滤结果。

它设置位j(将1移动j)。然后执行“和”使用i-也就是说,将i中的所有内容都设置为0,但不设置位j,并保持位j不变。最后,如果结果>0,则进行比较。由于唯一剩下的是位j,其效果是,它检查位j是否设置为i。好的。这有助于更好地解释它。谢谢。
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]