1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

Цифры

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

  1. Diana

    Diana Гость

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

    Dimmuborgir Гость

    Репутация:
    0
    Код:
     int x;
    if (x%2)
    //нечетное
    else
    //четное
     
  3. European

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

    Kmet Well-Known Member
    Java Team

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

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

    Kmet Well-Known Member
    Java Team

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

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

    Kmet Well-Known Member
    Java Team

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

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

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

    Kmet Well-Known Member
    Java Team

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

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

    SunSanych Well-Known Member

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

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

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

    Код:
    ; 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
    Java Team

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

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

    biz Гость

    Репутация:
    0
    вот самый простой вариант:

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

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

    biz Гость

    Репутация:
    0
    я не работаю в команде!) я сам по себе...
     
  18. Kmet

    Kmet Well-Known Member
    Java Team

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

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

    Kmet Well-Known Member
    Java Team

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

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