Пожалуйста, помогите решить эту проблему и объяснить логику. Я не знаю, как работает оператор & здесь.
void main() { int a = -1; static int count; while (a) { count++; a &= a - 1; } printf("%d", count); }
Если вы имеете в виду
a&=a-1;
тогда это побитовое и операция a и a-1 копируется в последующее.
Edit: Скопировано из Тадеуша А. Кадлубовского в комментарии:
a = a & (a-1);
Выражение a&=a-1; очищает младший значащий бит (крайний справа 1) из a.Код подсчитывает количество бит в a (в данном случае -1).
a
Начиная с
a = -1 ; // 11111111 11111111 11111111 11111111 32bits signed integer
Код выводит 32 в 32-битной целочисленной конфигурации.
32
& это бит и оператор .
&
Операция
, что совпадает с:
a = a & a-1;
очищает младший значащий бит a.
Таким образом, ваша программа эффективно вычисляет количество битов, установленных в a.
И поскольку count объявлен как static, он автоматически будет инициализирован до 0.
count
static
0
у вас количество неинициализированных
должно быть
static int count=0;
оператор & называется AND http://en.wikipedia.org/wiki/Bitwise_operation#AND