Explain this code.

void printSubsequences(int arr[], int n)
unsigned int opsize = pow(2, n);

    for (int counter = 1; counter < opsize; counter++)
        for (int j = 0; j < n; j++)
            if (counter & (1<<j))
                cout << arr[j] << " ";
        cout << endl;
**This is algorithm for sub sequences**.
how sub sequences can be found by this ?

This link, https://www.hackerearth.com/practice/notes/bit-manipulation/ should help.


@gautamcse27 You must have understood that the total number of subsequences are 2^n and in each of subsequence there is at most n elements. Everytime we decide for each element to take that element or not. So total 2^n subsequences.

Now outer loop (i.e counter) runs from 1 to 2^n and we get every combination like for n=2 we get 01 00 11 10 and for each iteration of outer loop we go from 0 to n-1 [0,n-1] (inner loop) and take and 1<<j for this case n=2 so it will be 01 and 10 i.e (1<<0 and 1<<1).
So you can see that we are going through each possible unique set out of n values.Because we iterated through all possible sets (which is denoted by binary representation of 1 to 2^n values) and took and (&) with (0001,0010,0100,1000 ) say for n=4.
Hope this is clear.