Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Цифры
Diana
Вставить ник
сообщение 27:03:2008, 06:44
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 28
Регистрация: 28:06:2007
Пользователь №: 11 595
Специализация: инженер-программист



Репутация: - 0 +


Всем Здрасте!
Как можно проверить цифры на чётность и не чётность?
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 28)
Dimmuborgir
Вставить ник
сообщение 27:03:2008, 07:04
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 57
Регистрация: 27:12:2007
Пользователь №: 14 492
Специализация: Программист Visual C++



Репутация: - 0 +


Код
  int x;
  if (x%2)
    //нечетное
  else
    //четное


Сообщение отредактировал Dimmuborgir - 27:03:2008, 07:04
Подняться вверх 
 
Сообщение #2
European
Вставить ник
сообщение 27:03:2008, 09:29
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Еще можно воспользоваться менее распространенным, но более эффективным способом:
Код
int x;
if( x & 1 )
   //нечетное
else
    //четное
Подняться вверх 
 
Сообщение #3
Kmet
Вставить ник
сообщение 27:03:2008, 10:45
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


Цитата
Premature optimization is the root of all evil
если не ошибаюсь, товарищ Кнут
Подняться вверх 
 
Сообщение #4
European
Вставить ник
сообщение 27:03:2008, 10:53
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Kmet, где здесь первопричина всех зол?
Подняться вверх 
 
Сообщение #5
Kmet
Вставить ник
сообщение 27:03:2008, 11:56
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


Цитата(European @ 27:03:2008 - 12:29) *
if( x & 1 )


1. менее очевидная запись
2. предполагаю, что для современных компиляторов записи эквиваленты.
Подняться вверх 
 
Сообщение #6
European
Вставить ник
сообщение 27:03:2008, 12:20
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(Kmet @ 27:03:2008 - 14:56) *
1. менее очевидная запись

Согласен, но я и не настаиваю на его повсеместном применении
Цитата(Kmet @ 27:03:2008 - 14:56) *
2. предполагаю, что для современных компиляторов записи эквиваленты.

С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
Подняться вверх 
 
Сообщение #7
Kmet
Вставить ник
сообщение 27:03:2008, 13:19
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


Цитата(European @ 27:03:2008 - 15:20) *
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.

лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно.
Подняться вверх 
 
Сообщение #8
European
Вставить ник
сообщение 27:03:2008, 13:30
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(Kmet @ 27:03:2008 - 16:19) *
но сейчас обе конструкции будут скомпилированны подобно.

Подобно, но не одинаково. Вернее не совсем подобно. Не нужно компилятор делать умнее платформы x86. И годы здесь не причем.

Напиши обе конструкции на асме и посмотри степень подобия
Подняться вверх 
 
Сообщение #9
Kmet
Вставить ник
сообщение 27:03:2008, 13:43
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


Цитата(European @ 27:03:2008 - 16:30) *
Напиши обе конструкции на асме и посмотри степень подобия


и причем здесь асамблер и плаформа х86?! оптимизацию при компиляции никто не отменял. и в этом смысле годы как раз таки при деле.
Подняться вверх 
 
Сообщение #10
European
Вставить ник
сообщение 27:03:2008, 14:15
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(Kmet @ 27:03:2008 - 16:43) *
и причем здесь асамблер и плаформа х86?!

Вот ассемблер здесь очень причем, даже если отвлечься от платформы.
Цитата(Kmet @ 27:03:2008 - 16:43) *
оптимизацию при компиляции никто не отменял

Если код и будет одинаковым, то ближе к моему варианту
Подняться вверх 
 
Сообщение #11
SunSanych
Вставить ник
сообщение 27:03:2008, 14:43
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 62
Регистрация: 28:06:2006
Пользователь №: 5 086
Специализация: программист С++



Репутация: - 2 +


Для 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 компилятора второй вариант однозначно быстрее. Другое дело как это заметить в реальной программе.

Сообщение отредактировал SunSanych - 27:03:2008, 14:48
Подняться вверх 
 
Сообщение #12
sax_ol
Вставить ник
сообщение 27:03:2008, 14:56
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 878
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 28 +


SunSanych
Посмотрел в Delphi - теже булочки.
Подняться вверх 
 
Сообщение #13
Kmet
Вставить ник
сообщение 27:03:2008, 15:20
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


gcc 3.4.4.1 -o3 with cygwin 2.510: с оптимизировал наславу, как и все остальные трюки со сдвигом вместо умножения и деления на 2. почему vs2005 не разрулил такую тривиальную ситуации не знаю.
Подняться вверх 
 
Сообщение #14
European
Вставить ник
сообщение 27:03:2008, 15:23
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(Kmet @ 27:03:2008 - 18:20) *
с оптимизировал наславу

Оба варианта привел к сдвигу? А что будет если необходимо проверить на четность отрицательное число? И какой код будет сгенерирован для получения остатка от деления, ну например, на 6?

Сообщение отредактировал European - 28:03:2008, 07:57
Подняться вверх 
 
Сообщение #15
biz
Вставить ник
сообщение 16:04:2008, 08:18
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 39
Регистрация: 15:04:2008
Пользователь №: 16 634
Специализация: Программист



Репутация: - 0 +


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

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


Сообщение отредактировал biz - 16:04:2008, 10:11
Подняться вверх 
 
Сообщение #16
European
Вставить ник
сообщение 16:04:2008, 09:34
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(biz @ 16:04:2008 - 10:18) *
вот самый простой вариант!!

если не боишься, что члены твоей команды запинают тебя ногами, то можешь продолжать в том же духе
Подняться вверх 
 
Сообщение #17
biz
Вставить ник
сообщение 16:04:2008, 09:41
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 39
Регистрация: 15:04:2008
Пользователь №: 16 634
Специализация: Программист



Репутация: - 0 +


Цитата(European @ 16:04:2008 - 12:34) *
если не боишься, что члены твоей команды запинают тебя ногами, то можешь продолжать в том же духе

я не работаю в команде!) я сам по себе...
Подняться вверх 
 
Сообщение #18
Kmet
Вставить ник
сообщение 16:04:2008, 09:43
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


и не переносимо
Подняться вверх 
 
Сообщение #19
European
Вставить ник
сообщение 16:04:2008, 10:20
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(biz @ 16:04:2008 - 11:41) *
я не работаю в команде!) я сам по себе...

Чего же код удалил?
Подняться вверх 
 
Сообщение #20
Kmet
Вставить ник
сообщение 16:04:2008, 10:21
Цитата Ответить 


Мегагуру
****

Группа: Достойный программист
Сообщений: 538
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 4 +


все же возможность редактировать сообщения не есть тру
Подняться вверх 
 
Сообщение #21
biz
Вставить ник
сообщение 16:04:2008, 10:22
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 39
Регистрация: 15:04:2008
Пользователь №: 16 634
Специализация: Программист



Репутация: - 0 +


European
нашел синтаксическую ошибку. исправил))
Подняться вверх 
 
Сообщение #22
European
Вставить ник
сообщение 16:04:2008, 10:34
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 869
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


Цитата(biz @ 16:04:2008 - 12:22) *
нашел синтаксическую ошибку. исправил))

Короче, струхнул...
Подняться вверх 
 
Сообщение #23
biz
Вставить ник
сообщение 16:04:2008, 10:56
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 39
Регистрация: 15:04:2008
Пользователь №: 16 634
Специализация: Программист



Репутация: - 0 +