Объясните, пожалуйста, условие 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.