Страница 2 из 8

Оптимизация

Добавлено: 12 янв 2008, 23:28
master
qwertylol писал(а):Source of the post
Я тут увидел у вас задачку по, не побоюсь этого слова, программированию. Вот тоже решил запостить довольно интересную, на мой взгляд, задачку. Цель- опитмизировать код, т.e. сделать его как можно меньше, но чтобы он не потерял в функциональности.

Код: Выбрать все

if(!(A<=0) && !(B>=0))
 n=A-((A>>6)<<6);
else if(!A && B!=0)
 n=(5*A*B)%4;
else
 n=A&0x3f;

Эта задачка из одной не очень известной книги. Сам я этот примерчик решить не смог и даже после того, как посмотрел правильный ответ, несколько минут сидел c листком и ручкой не веря в то, что так очевидно :yes: .


Код: Выбрать все

if(!(A<=0) && !(B>=0)) // A>0
 n=A-((A>>6)<<6); // Это по сути выделение младших 6 бит. Объяснения требуются, или сами :)?
else if(!A && B!=0)// !A всё рвно что A==0
 n=(5*A*B)%4; //n=0
else
 n=A&0x3f; // Выделение младших 6 бит.


итого


Код: Выбрать все

if(!A && B!=0)
 n=0
else
 n=A&0x3f;


Верно? :rolleyes:

Оптимизация

Добавлено: 12 янв 2008, 23:52
qwertylol
Хех, вы ведь сами написали "!A всё рвно что A==0"! a если A==0, то A&63 чему будет равно?
З.Ы. вместо B!=0 можно писать B, a вместо посимвольного сравнения нужно использовать побайтовое. Посимвольное сравнение надо использовать только тогда, когда количество логических выражений в условии очень велико(более пяти) и вы уверены, что скорее всего после одного из первых условий можно будет сделать вывод o значении всего выражения.
З.Ы. a я то и не заметил, что в своём первом посте вы меня цитировали :huh: . Я думал вы ответ писали.

Оптимизация

Добавлено: 12 янв 2008, 23:58
a_l_e_x86
Продолжим тему
Что делает такой код?

Код: Выбрать все

cmp al,10
sbb al,69h
das

Оптимизация

Добавлено: 13 янв 2008, 00:10
qwertylol
alex, этого явно не достаточно! Нужно либо написать всю функцию, либо указать значение регистров al и EFL.

Оптимизация

Добавлено: 13 янв 2008, 00:37
a_l_e_x86
qwertylol писал(а):Source of the post
alex, этого явно не достаточно! Нужно либо написать всю функцию, либо указать значение регистров al и EFL.

Этот набор команд преобразует некоторым образом содержимое регистра al. Вам надо догадаться какое именно преобразование происходит.
Насчет флагов - не забываем, что команда sbb (вычитание c займом) и cmp (сравнение) модифицируют регистр флагов в зависимости от результата операции. Так что все достаточно.
Прием очень известный, так что кто знает, не высказываемся, даем другим подумать

Оптимизация

Добавлено: 13 янв 2008, 00:48
master
думаю...
...от al вычитается двоично-десятичное 69, но c какой целью до сознания пока не дошло...

Оптимизация

Добавлено: 13 янв 2008, 00:58
qwertylol
a... я понял . Командой cmp мы устанавливаем флаг AF, затем вычитаем из al 69h и т.к. флаг AF установлен, то независимо от правых битов вычитаем ещё 6.
Ответ: содержимое al уменьшится на 6f

Оптимизация

Добавлено: 13 янв 2008, 01:06
a_l_e_x86
Да, забыл сказать, в al число не более 0Fh

Оптимизация

Добавлено: 13 янв 2008, 01:19
a_l_e_x86
qwertylol писал(а):Source of the post
a... я понял . Командой cmp мы устанавливаем флаг AF....

Ну не обязательно устанавливаем, только если в al число меньшее 10. A еще есть флаг переноса... :whistle:

Оптимизация

Добавлено: 13 янв 2008, 01:31
master
a_l_e_x86 писал(а):Source of the post
qwertylol писал(а):Source of the post
a... я понял . Командой cmp мы устанавливаем флаг AF....

Ну не обязательно устанавливаем, только если в al число меньшее 10. A еще есть флаг переноса... :whistle:

C этого надо было начинать )))
Я сначала заметил что будет если будет десятичное число между 0-9... но ьуь же эту мысль почему то отсёк...