Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
27:03:2008, 06:44
|
|
Новенький ![]() Группа: Программист Сообщений: 28 Регистрация: 28:06:2007 Пользователь №: 11 595 Специализация: инженер-программист Репутация: 0
|
Всем Здрасте!
Как можно проверить цифры на чётность и не чётность? |
|
Сообщение
#1
|
|
![]() |
|
|
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
|
|
|
|
27:03:2008, 09:29
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Еще можно воспользоваться менее распространенным, но более эффективным способом:
Код int x;
if( x & 1 ) //нечетное else //четное |
|
Сообщение
#3
|
|
|
|
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
|
|
|
|
27:03:2008, 10:53
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
Kmet, где здесь первопричина всех зол?
|
|
Сообщение
#5
|
|
|
|
27:03:2008, 11:56
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Достойный программист Сообщений: 538 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 4
|
|
|
Сообщение
#6
|
|
|
|
27:03:2008, 12:20
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
1. менее очевидная запись Согласен, но я и не настаиваю на его повсеместном применении 2. предполагаю, что для современных компиляторов записи эквиваленты. С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу. |
|
Сообщение
#7
|
|
|
|
27:03:2008, 13:19
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Достойный программист Сообщений: 538 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 4
|
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу. лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно. |
|
Сообщение
#8
|
|
|
|
27:03:2008, 13:30
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#9
|
|
|
|
27:03:2008, 13:43
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Достойный программист Сообщений: 538 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 4
|
|
|
Сообщение
#10
|
|
|
|
27:03:2008, 14:15
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#11
|
|
|
|
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
|
|
|
|
27:03:2008, 14:56
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
SunSanych
Посмотрел в Delphi - теже булочки. |
|
Сообщение
#13
|
|
|
|
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
|
|
|
|
27:03:2008, 15:23
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#15
|
|
|
|
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
|
|
|
|
16:04:2008, 09:34
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#17
|
|
|
|
16:04:2008, 09:41
|
|
Новенький ![]() Группа: Программист Сообщений: 39 Регистрация: 15:04:2008 Пользователь №: 16 634 Специализация: Программист Репутация: 0
|
|
|
Сообщение
#18
|
|
|
|
16:04:2008, 09:43
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Достойный программист Сообщений: 538 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 4
|
и не переносимо
|
|
Сообщение
#19
|
|
|
|
16:04:2008, 10:20
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#20
|
|
|
|
16:04:2008, 10:21
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Достойный программист Сообщений: 538 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 4
|
все же возможность редактировать сообщения не есть тру
|
|
Сообщение
#21
|
|
|
|
16:04:2008, 10:22
|
|
Новенький ![]() Группа: Программист Сообщений: 39 Регистрация: 15:04:2008 Пользователь №: 16 634 Специализация: Программист Репутация: 0
|
European
нашел синтаксическую ошибку. исправил)) |
|
Сообщение
#22
|
|
|
|
16:04:2008, 10:34
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 869 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#23
|
|
|
|
16:04:2008, 10:56
|
|
Новенький ![]() Группа: Программист Сообщений: 39 Регистрация: 15:04:2008 Пользователь №: 16 634 Специализация: Программист Репутация: 0
|