ニックHeiting:
私は与えられたセットのすべてのサブセットを見つけるために、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);
}
}
フレーク:
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 & (1 << j)) > 0)
結果をフィルタリングするためにビットをチェックするために使用されます。