Объясните, пожалуйста, условие if (S&(1<

Перебрать все возможные суммы элементов массива. Поясните, пожалуйста, как в этом случае работают побитовые операции в if.

long S;
int a[N];

// Заполните массив a - рандомно или вводом - по вкусу
for (m = 1, i = 0; i < N; i++)
    m = 2*m;  // m - количество точек перебора

for (S = 1; S < m; S++)
{
    for (j = 0, sum = 0; j < N; j++) 
        if (S & (1 << j))
        {
            printf("+%d", a[j]);
            sum += a[j];
        }
    printf ("=%d\n", sum);
}

Ответы (1 шт):

Автор решения: Harry

Начнем с 1 << j - это сдвиг 1 влево на j позиций.

Операция & - побитовое И, которое дает 1 в некоторой позиции результата, если в этой позиции в обоих операндах 1, и 0 в противном случае.

Итак - S&(1<<j) дает ненулевое значение (истину :)) тогда и только тогда, когда в S бит в j-ой позиции равен 1.

→ Ссылка