Нужно четко понимать.
Нужна ли подобная "оптимизация"... как тут справедливо заметили... что если нет ресурсов и т.п. знание архитектуры даст больше плюсов чем подобные извращения... а в результате такой чудо оптимизации пострадает сам код и его понимание... хорошо если вы сравнили числа через вычитание одного из другого... а когда таких финтов наберется десяток.. то код можно выбросить... имхо.
И уж темболее такие извращения не нужны в скриптованных и Runtime языках... т.к. "на лету" происходит оптимизация.
Скорее тот кто на собеседовании приводит такие задачи(темболее на вакансию 1С программиста...)... просто страдает комплексами... мое ИМХО.
[Ответ]
MadFish 11:41 25.08.2008
Сообщение от Pengvin:
веселый код, например кодера который помешан на указателях у него параметры передавались примерно так:
int foo(int *i)
причем в аргумент есть одна единственная переменная, т.е. это все передавалось int z; foo(&z). Собственно размер указателя на int равен самому int. Т.е. человек слышал, что указатели это круто, но видимо с трудом понимает что они представляют.
Это имхо
ага, а еще есть понятие локальных переменных и область видимости так что чел делал все правильно!!! ИМХО
народ, ну как же решается задачка с максимумом двух чисел??? интересно же...
[Ответ]
RDS 12:41 25.08.2008
Сообщение от MadFish:
народ, ну как же решается задачка с максимумом двух чисел??? интересно же...
Сообщение от MadFish:
ага, а еще есть понятие локальных переменных и область видимости так что чел делал все правильно!!! ИМХО
незнаю что там насчет локальных переменных и области видимости мы в институтах не обучалися грамоте не разумеем, но посмотрим на это с другой стороны.
Вот я накалякал:
int foo(int* i)
{
*i=10;
return *i;
}
int fooo(int i)
{
i=10;
return i;
}
имеем то что генерирует компилятор VC
как видно одна лишняя команда генерируется. Я вобще с удовольствием хочу узнать по какой причине нам это вобще нужно использовать для переменных ибо я ламер.
[Ответ]
MadFish 17:18 25.08.2008
Сообщение от Pengvin:
mov DWORD PTR _i$[ebp], 10 ; 0000000aH
Вот по этому!!!
А вообще способ передачи параметров не определен, и зависит от целевой платформы (отключи при компиляции оптимизацию и увидишь много интересного )
Если процедура меняет входной параметр, и он необходим в основной программе после выполнения процедуры, его надо передавать по сцылке, ну или указателем кому как нравится.
ЗЫ. а вот такой вариант :
int d=a-b;
int n= a-a%b;
//(если определена функция возведения в степень) **
int max=a-(0**n)*d;
//(если функция возведения в степень не определена тогда только машиннозависимым способом ) **
int k=1&n;
n=n>>1;
k|=1&n;
n=n>>1;
k|=1&n;
//... и так до двоичной размерности int
int max=b+k*d;
[Ответ]
][irurg 09:29 26.08.2008
Сообщение от MadFish:
int d=a-b;
int n= a-a%b;
//(если определена функция возведения в степень) **
int max=a-(0**n)*d;
(0**n)*d - не понял.. 0 в любой степени ноль, выражение =0, макс всегда = а..
[Ответ]
MadFish 09:54 26.08.2008
Сообщение от ][irurg:
(0**n)*d - не понял.. 0 в любой степени ноль
кому-то пора ф школу любое число в степени 0 = 1 [Ответ]
][irurg 13:27 26.08.2008
Сообщение от MadFish:
кому-то пора ф школу
нет благодарю
так понимаю x**y означает возведение x в степень y. то бишь в вашей записи 0 в степень n. =0.
хочется пояснений
[Ответ]
MadFish 13:50 26.08.2008
Сообщение от ][irurg:
хочется пояснений
это особая уличная магия
если a<b
то n=0 т.к. a%b=a; => (0**0)=1 и вуаля...
[Ответ]
][irurg 13:59 26.08.2008
аплодировал стоя, весь офис обернулся
последний вопрос, если можно - что за операция a%b? я грешным делом подумал что остаток от деления, но не срасталось...
[Ответ]
MadFish, большое спасибо за объяснения. А то я думал это кодер тот дурак, а это я дурак оказался. Тем более в коде это все видно было я что-то протупил, он же стековый кадр меняет, а не переменную.
PS: это кстати с /Od
[Ответ]
Сообщение от Part!zan:
К сожалению, это не сработает, если b==0.
как раз думаю над этим. если чего придумаю напишу.
И еще реализация ** скорее всего будет содержать сравнения. Ежли кто может, подскажите функцию возвращающую 0 для 0 и 1 для всех остальных чисел...
[Ответ]
Part!zan 00:05 27.08.2008
Мне вот интересно, то решение, которое я в инете нашел и на предыдущей странице дал ссылку, оно, типа, никого не заинтересовало или просто никто не заметил? ) А то там все честно, никаких сравнений и вызовов функций, кроме как для получения аргументов из ком. строки и вывода результата. Вот только код писал явно маньяк...
Кстати, я только что допер, что в условии просят не пользоваться оператором сравнения, а не операцией.
[Ответ]
The_God 01:33 27.08.2008
Сообщение от Part!zan:
просто никто не заметил
заметил ,) там вабще маньяк програмил его
ps зачем нужно решать такие странные задачи с такими искусственными ограничениями ?
[Ответ]
][irurg 09:29 27.08.2008
затем же зачем люди отгадывают загадки или читают детективы )
давайте еще задач красивых и разных
[Ответ]
Yandex 12:57 27.08.2008
Part!zan, нашел ты ответ, который я имел в виду, во второй ссылке - "(a+b)/2 + |a-b|/2".
Чего там исхитряться то? Задачку в 10-м классе на информатике давали.
[Ответ]
Part!zan 19:48 27.08.2008
Yandex, так модуль числа - это же функция в большинстве языков. И на большинстве платформ нет асмовой операции модуля, поэтому будет сравнение, хоть и неявное. То есть решение не вполне "чистое". А вот "маньяческое" решение чище не бывает. Но разобраться в нем я пока еще не смог ) Да, и мое замечание насчет оператора/операции. Ведь если ограничение только на операторы сравнения (то есть if, switch), то можно вообще обойтись (a<b)? b : a
[Ответ]
][irurg 09:22 28.08.2008
насчет маньячного решения- имхо не решение это вовсе, больше похоже на набор операторов. вот, взял на себя труд отредактировать это чудо
Сообщение от :
typedef unsigned long q1;
int printf(const char*,...);
long strtol(const char*,char**,int);
q1 q2(q1 q3,q1 q4,q1 q5,q1q6)
{return(q5-q6)*(((((q3-q4)&(q4-q3) )+2)/(((q3-q4)&(q4-q3))+1))-1)+q6;}
q1 q7(long q8)
{return q2(q8,0,q2(q8/2,0,1,0),0);}
q1 q9(long q8)
{return q2(q8,-1,q2(q8/2,-1,1,q2(q8/2,0,1,0) ),0);}
q1 q10(long);
q1 q11(long q8)
{return 0;}
q1 q12(long q8)
{return 1;}
q1 q13(long q8)
{return q10(q8/2);}
q1 q14(long q8)
{q1(*q15[])(long)={q12,q13};return q15[q2(q9(q8),1,0,1)](q8);}
q1 q10(long q8)
{q1(*q15[])(long)={q11,q14};
return q15[ q2(q7(q8),1,0 ,1)](q8);}
q1 q17(long q3, long q4)
{return q2(q10( q3),1,q2(q10(q4),1,q10(q3-q4),1), q2(q10(q4),1 ,0,q10(q3-q4 )));}
long q18(long q3,long q4){return q3;}
long q19(long q3,long q4){return q4;}
long q20(long q3,long q4)
{long(*q15[])(long,long)={q19,q18};
return q15[q2(q17(q3,q4),1,0,1)](q3,q4);}
long q21(const char*q2)
{return strtol(q2,0,10);}
int q22(char **q23)
{printf("%ld""\n",q20(q21(q23[1]),q21(q23[2])));return 0;}
int q24(char**q23)
{return 0;}
int main(int q25,char**q23)
{int(*q15[])(char**)={q24,q22};
return q15[q2(q25,3,1,0)](q23);}