Страница 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 бит.
итого
Верно? :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
Продолжим тему
Что делает такой код?
Оптимизация
Добавлено: 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
Ну не обязательно устанавливаем, только если в al число меньшее 10. A еще есть флаг переноса... :whistle:
Оптимизация
Добавлено: 13 янв 2008, 01:31
master
a_l_e_x86 писал(а):Source of the post Ну не обязательно устанавливаем, только если в al число меньшее 10. A еще есть флаг переноса... :whistle:
C этого надо было начинать )))
Я сначала заметил что будет если будет десятичное число между 0-9... но ьуь же эту мысль почему то отсёк...