Nhờ giải thích dòng lệnh

Mình không hiểu dòng if (!(i & (1<<j))). Mong mọi người giải thích cho mình.

       #include<bits/stdc++.h>
        using namespace std;

        int n;
        int a[21];

        int main(){
            cin >> n;
            for(int i=0; i<n; i++) cin >> a[i];

            for(int i=0; i < (1<<n); i++){

                    for(int j=0; j < n; j++)
                    if (!(i & (1<<j)))  // dòng này
                                     cout<<a[j]<<" ";

                cout<<"\n";
            }
        }

1<<j là 2^j;2¹ = 2, 2² = 4

i & 2^j kiểu như xem i với 2^j có bit nào giống nhau ko

ví dụ:

i = 2 -> i = 0b0010;

j= 2-> 2^j = 0b0100;

& là bitweise AND bạn so sánh từng bit của i với 2^j( bit-0 với bit-0, bit-1 với bit-1 …)

0 & 0 = 0, 0&1 = 0, 1&1=1
ở đây 0b0010 & 0b0100 = 0b0000

!(0b0010 & 0b0100) = 1 nên in ra a[j] (a[2])

lưu ý i=0 thì i&j = 0 nên i=0 thì in ra hết a[j] mặc dù 0 != 2^j

lệnh này mình hiểu nhưng mà cả cái code làm gì thì mình cũng bó tay

5 Likes

Hiểu là “nếu bit thứ j trong biến i bằng 0 thì”…

7 Likes

rất chi tiết và dễ hiểu, cảm ơn bạn nhiều !

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?