Цифры

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

Diana

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

Dimmuborgir

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

European

Еще можно воспользоваться менее распространенным, но более эффективным способом:
Код:
int x;
if( x & 1 )
//нечетное
else
//четное
 
E

European

Kmet, где здесь первопричина всех зол?
 
E

European

1. менее очевидная запись
Согласен, но я и не настаиваю на его повсеместном применении
2. предполагаю, что для современных компиляторов записи эквиваленты.
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно.
 
E

European

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

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

European

и причем здесь асамблер и плаформа х86?!
Вот ассемблер здесь очень причем, даже если отвлечься от платформы.
оптимизацию при компиляции никто не отменял
Если код и будет одинаковым, то ближе к моему варианту
 
S

SunSanych

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
gcc 3.4.4.1 -o3 with cygwin 2.510: с оптимизировал наславу, как и все остальные трюки со сдвигом вместо умножения и деления на 2. почему vs2005 не разрулил такую тривиальную ситуации не знаю.
 
E

European

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

biz

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

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
все же возможность редактировать сообщения не есть тру
 
Мы в соцсетях:

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