Показать сообщение отдельно
  #13  
Старый 13.01.2013, 15:43
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
тоже вариант, но работает слегка медленней, так как сбрасываются все биты, кроме одного. но ничего, это заметно разве что на аппаратном уровне
Мда. Вообще-то оба числа загружаются в АЛУ, после чего выполняется операция и считывается результат. Даже если число не изменилось вообще, оно будет перезаписано. При этом в АЛУ все операции (логические и +/-) выполняются одновременно над всеми битами. Поэтому скорость абсолютно одинаковая с этой точки зрения.
А вот с другой стороны скорость примера D_E_N_ гораздо ниже. Потому что все логические операции меняют флаги, в т.ч. флаг нуля. Если делать and 1
Код:
mov eax, [N]
and eax, 1
jz ...
; или даже
test [N], 1
jz ...
то в результате будет либо 0, либо 1. В первом случае установится флаг нуля, во втором - сбросится. То есть сравнение производится в 1 команду. А если делать вариант с N or 1 <> N, то надо сначала применить or, а потом еще и сравнить с N (в то время как сравнение гораздо дольше логических операций). И добавляется еще копирование числа между регистрами.
Код:
mov eax, [N]
mov ebx, eax
or eax, 1
cmp eax, ebx
jz ....
Именно поэтому делфийский ODD компилится в первый вариант.
Вопрос только в том, почему мы уже 7 постов подряд обсуждаем четные/нечетные, в то время как парные - совсем другое. Для неверующих - 2 пост в помощь.
Чтобы проверить парность чисел, одно число должно быть на 2 меньше другого, то есть надо их вычесть и результат сравнить с 2.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием