Цифры

  • Автор темы Автор темы Diana
  • Дата начала Дата начала
D

Diana

Всем Здрасте!
Как можно проверить цифры на чётность и не чётность?
 
Код:
 int x;
if (x%2)
//нечетное
else
//четное
 
Еще можно воспользоваться менее распространенным, но более эффективным способом:
Код:
int x;
if( x & 1 )
//нечетное
else
//четное
 
Kmet, где здесь первопричина всех зол?
 
1. менее очевидная запись
Согласен, но я и не настаиваю на его повсеместном применении
2. предполагаю, что для современных компиляторов записи эквиваленты.
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
 
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно.
 
но сейчас обе конструкции будут скомпилированны подобно.
Подобно, но не одинаково. Вернее не совсем подобно. Не нужно компилятор делать умнее платформы x86. И годы здесь не причем.

Напиши обе конструкции на асме и посмотри степень подобия
 
и причем здесь асамблер и плаформа х86?!
Вот ассемблер здесь очень причем, даже если отвлечься от платформы.
оптимизацию при компиляции никто не отменял
Если код и будет одинаковым, то ближе к моему варианту
 
Для 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 компилятора второй вариант однозначно быстрее. Другое дело как это заметить в реальной программе.
 
gcc 3.4.4.1 -o3 with cygwin 2.510: с оптимизировал наславу, как и все остальные трюки со сдвигом вместо умножения и деления на 2. почему vs2005 не разрулил такую тривиальную ситуации не знаю.
 
с оптимизировал наславу
Оба варианта привел к сдвигу? А что будет если необходимо проверить на четность отрицательное число? И какой код будет сгенерирован для получения остатка от деления, ну например, на 6?
 
вот самый простой вариант:

Код:
	if ( x & 1 ) {
printf( "нечетное" );
} else {
printf( "четное" );
}
 
все же возможность редактировать сообщения не есть тру
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!