Цифры

Тема в разделе "Общие вопросы по С и С++", создана пользователем Diana, 27 мар 2008.

  1. Diana

    Diana Гость

    Всем Здрасте!
    Как можно проверить цифры на чётность и не чётность?
     
  2. Dimmuborgir

    Dimmuborgir Гость

    Код (Text):
     int x;
    if (x%2)
    //нечетное
    else
    //четное
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Еще можно воспользоваться менее распространенным, но более эффективным способом:
    Код (Text):
    int x;
    if( x & 1 )
    //нечетное
    else
    //четное
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    если не ошибаюсь, товарищ Кнут
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Kmet, где здесь первопричина всех зол?
     
  6. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    1. менее очевидная запись
    2. предполагаю, что для современных компиляторов записи эквиваленты.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Согласен, но я и не настаиваю на его повсеместном применении
    С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
     
  8. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно.
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Подобно, но не одинаково. Вернее не совсем подобно. Не нужно компилятор делать умнее платформы x86. И годы здесь не причем.

    Напиши обе конструкции на асме и посмотри степень подобия
     
  10. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    и причем здесь асамблер и плаформа х86?! оптимизацию при компиляции никто не отменял. и в этом смысле годы как раз таки при деле.
     
  11. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Вот ассемблер здесь очень причем, даже если отвлечься от платформы.
    Если код и будет одинаковым, то ближе к моему варианту
     
  12. SunSanych

    SunSanych Well-Known Member

    Регистрация:
    28 июн 2006
    Сообщения:
    71
    Симпатии:
    0
    Для European и Kmet:

    Мне вот тоже стало интересно, но чтобы говорить предметно, я засунул код в VisualStudio2005 и посмотрел ассемблерный листинг. Выставил оптимизацию на Maximize Speed (/O2) и попросил вывести исходный код с ассемблерным.

    Вот что получилось:

    Код (Text):
    ; 210 :     int a;
    ; 211 :     if (x%2)

    00005   25 01 00 00 80   and     eax, -2147483647; 80000001H
    0000a   79 05        jns     SHORT $LN5@main
    0000c   48       dec     eax
    0000d   83 c8 fe     or  eax, -2    ; fffffffeH
    00010   40       inc     eax
    $LN5@main:
    00011   f7 d8        neg     eax
    00013   1b c0        sbb     eax, eax
    00015   f7 d8        neg     eax

    ; 212 :         a=1;
    ; 213 :     else
    ; 214 :         a=0;

    ; 216 :     if(x&1)

    00005   0f be c0     movsx   eax, al
    00008   83 e0 01     and     eax, 1

    ; 217 :         a=1;
    ; 218 :     else
    ; 219 :         a=0;
    Конечно, разные компиляторы, с разными настройками дадут разный результат, но для MS компилятора второй вариант однозначно быстрее. Другое дело как это заметить в реальной программе.
     
  13. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    gcc 3.4.4.1 -o3 with cygwin 2.510: с оптимизировал наславу, как и все остальные трюки со сдвигом вместо умножения и деления на 2. почему vs2005 не разрулил такую тривиальную ситуации не знаю.
     
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Оба варианта привел к сдвигу? А что будет если необходимо проверить на четность отрицательное число? И какой код будет сгенерирован для получения остатка от деления, ну например, на 6?
     
  15. biz

    biz Гость

    вот самый простой вариант:

    Код (Text):
        if ( x & 1 ) {
    printf( "нечетное" );
    } else {
    printf( "четное" );
    }
     
  16. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    если не боишься, что члены твоей команды запинают тебя ногами, то можешь продолжать в том же духе
     
  17. biz

    biz Гость

    я не работаю в команде!) я сам по себе...
     
  18. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    и не переносимо
     
  19. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Чего же код удалил?
     
  20. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    все же возможность редактировать сообщения не есть тру
     
Загрузка...

Поделиться этой страницей