Цифры

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

Diana

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

Dimmuborgir

Гость
#2
Код:
 int x;
if (x%2)
//нечетное
else
//четное
 
04.09.2006
2 566
2
Минск
#3
Еще можно воспользоваться менее распространенным, но более эффективным способом:
Код:
int x;
if( x & 1 )
//нечетное
else
//четное
 
04.09.2006
2 566
2
Минск
#7
1. менее очевидная запись
Согласен, но я и не настаиваю на его повсеместном применении
2. предполагаю, что для современных компиляторов записи эквиваленты.
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#8
С какой радости? Мой вариант - 1 инструкция (загрузку регистров не считаю). Даже в случае четного числа необходимо дополнительно проверить результат - плюс инструкция и переход. Про нечетное я скромно помолчу.
лет этак 10-20 назад может быть. но сейчас обе конструкции будут скомпилированны подобно.
 
04.09.2006
2 566
2
Минск
#9
но сейчас обе конструкции будут скомпилированны подобно.
Подобно, но не одинаково. Вернее не совсем подобно. Не нужно компилятор делать умнее платформы x86. И годы здесь не причем.

Напиши обе конструкции на асме и посмотри степень подобия
 
04.09.2006
2 566
2
Минск
#11
и причем здесь асамблер и плаформа х86?!
Вот ассемблер здесь очень причем, даже если отвлечься от платформы.
оптимизацию при компиляции никто не отменял
Если код и будет одинаковым, то ближе к моему варианту
 

SunSanych

Well-Known Member
28.06.2006
71
0
#12
Для 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
Java Team
25.05.2006
1 036
8
#13
gcc 3.4.4.1 -o3 with cygwin 2.510: с оптимизировал наславу, как и все остальные трюки со сдвигом вместо умножения и деления на 2. почему vs2005 не разрулил такую тривиальную ситуации не знаю.
 
04.09.2006
2 566
2
Минск
#14
с оптимизировал наславу
Оба варианта привел к сдвигу? А что будет если необходимо проверить на четность отрицательное число? И какой код будет сгенерирован для получения остатка от деления, ну например, на 6?
 
B

biz

Гость
#15
вот самый простой вариант:

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

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#20
все же возможность редактировать сообщения не есть тру