Оптимизация

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 12 янв 2008, 23:28

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:
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 12 янв 2008, 23:52

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

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 12 янв 2008, 23:58

Продолжим тему
Что делает такой код?

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

cmp al,10
sbb al,69h
das
Последний раз редактировалось a_l_e_x86 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 13 янв 2008, 00:10

alex, этого явно не достаточно! Нужно либо написать всю функцию, либо указать значение регистров al и EFL.
Последний раз редактировалось qwertylol 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 13 янв 2008, 00:37

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

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

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 00:48

думаю...
...от al вычитается двоично-десятичное 69, но c какой целью до сознания пока не дошло...
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 13 янв 2008, 00:58

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

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 13 янв 2008, 01:06

Да, забыл сказать, в al число не более 0Fh
Последний раз редактировалось a_l_e_x86 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 13 янв 2008, 01:19

qwertylol писал(а):Source of the post
a... я понял . Командой cmp мы устанавливаем флаг AF....

Ну не обязательно устанавливаем, только если в al число меньшее 10. A еще есть флаг переноса... :whistle:
Последний раз редактировалось a_l_e_x86 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 01:31

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

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

C этого надо было начинать )))
Я сначала заметил что будет если будет десятичное число между 0-9... но ьуь же эту мысль почему то отсёк...
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 35 гостей