Страница 1 из 1

Цикл и условие

Добавлено: 08 июн 2014, 21:31
*girlie*
Доброго времени суток! :)
Есть программа на Си, которая отбирает числа, при переводе из десятичной системы в двоичную которых число число нулей оказывается на два больше, чем число единиц.
Пожалуйста, объясните поподробнее что происходит, когда мы открываем этот цикл 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();
}

Re: Цикл и условие

Добавлено: 09 июн 2014, 12:06
somewhere
Пожалуйста, объясните поподробнее что происходит, когда мы открываем этот цикл for (j = sizeof(int) * 8 - 1; j >= 0; j--) , и что означает это условие if (((i & (1 << j)) != 0) && (flag == 0)) ? В смысле, почему нам надо умножать sizeof(int) на 8 и потом еще вычитать один, а в условии зачем нужен сдвиг ( << - это же сдвиг, правда?)?
sizeof(int) дает размер типа в байтах (4 или 2)
sizeof(int)*8 - размер в битах, а поскольку биты нумеруются с 0, то номер последнего бита - это sizeof(int)*8-1
(1 << j) выделяет маску для проверки бита с номером j.
if (i & (1 << j)) != 0, - логическая операция, которая проверит в числе i установку бита j. Если бит установлен, то результат не будет равен нулю.
Пример для j = 5, i = 47
(1 << j) = 00000001 << 5 = 00100000
(i & (1 << j)) = 47 & 32 = 00101111 & 00100000 = 00100000
(00100000 != 0) - значит бит с номером j установлен

Re: Цикл и условие

Добавлено: 09 июн 2014, 12:23
*girlie*
somewhere писал(а):(i & (1 << j)) = 47 & 32 = 00101111 & 00100000 = 00100000
Спасибо большое! :) Даже, кажется, разобралась!
Только один вопрос: откуда в этой строке число 32? :confused: Это случайно не 2^5?

Re: Цикл и условие

Добавлено: 09 июн 2014, 13:21
somewhere
Только один вопрос: откуда в этой строке число 32? Это случайно не 2^5?
Результат перевода числа 00100000 из двоичного представления в десятичное.

Re: Цикл и условие

Добавлено: 09 июн 2014, 13:26
*girlie*
somewhere писал(а):Результат перевода числа 00100000 из двоичного представления в десятичное.

А, все, теперь понятно) Спасибо!

Re: Цикл и условие

Добавлено: 11 июн 2014, 13:29
*girlie*
somewhere писал(а):sizeof(int) дает размер типа в байтах (4 или 2)
А как понять 4 или 2 байта возвращает sizeof(int) в данном случае?

Re: Цикл и условие

Добавлено: 11 июн 2014, 13:54
somewhere
Зависит от компилятора и целевой платформы. Если судить по getch(), то приложение, скорее всего - для DOS-консоли и sizeof(int) даст 2

Re: Цикл и условие

Добавлено: 11 июн 2014, 18:13
*girlie*
Понятно, спасибо!