
Есть программа на Си, которая отбирает числа, при переводе из десятичной системы в двоичную которых число число нулей оказывается на два больше, чем число единиц.
Пожалуйста, объясните поподробнее что происходит, когда мы открываем этот цикл for (j = sizeof(int) * 8 - 1; j >= 0; j--) , и что означает это условие if (((i & (1 << j)) != 0) && (flag == 0)) ? В смысле, почему нам надо умножать sizeof(int) на 8 и потом еще вычитать один, а в условии зачем нужен сдвиг ( << - это же сдвиг, правда?)?
Код: Выделить всё
#include <stdio.h>
#include <conio.h>
main()
{
int i, ones, zeroes, j, lastbit, flag;
for (i = 300; i <= 799; i++)
{
lastbit = 0;
ones = 0;
zeroes = 0;
flag = 0;
for (j = sizeof(int) * 8 - 1; j >= 0; j--)
if (((i & (1 << j)) != 0) && (flag == 0))
{
lastbit = j;
flag = 1;
}
for (j = lastbit; j >= 0; j--)
if ((i & (1 << j)) != 0)
ones++;
else
zeroes++;
if (zeroes - ones == 2)
printf("%d ", i);
}
getch();
}