Всем привет.
сегодня наткнулся на задачку обмена значений двух переменных
без использования дополнительной переменной или ррегистров.
нашел два решения.
a ^= b;
b ^= a;
a ^= b;
ну ежели xor выразить через ~(a & b) & (a | b);
то запишется то же самое но чуть по другому поэтому не считается (;
второе
b -= a = (b += a) - a;
ну и собссно subject
Здравствуйте, cyc10ne, Вы писали:
A = A*B
B = A/B
A = A/B
А вообще, имхо, годятся любые два "противоположных" действия.
Вопрос только в реализации: потери при округлении и т.п.
UgN>А вообще, имхо, годятся любые два "противоположных" действия.
UgN>Вопрос только в реализации: потери при округлении и т.п.
тогда и логарифм с экспонентой подойдут
Здравствуйте, cyc10ne, Вы писали:
C>C>b -= a = (b += a) - a;
C>
я бы это переписал так
a=a-b;
b=a+b;
a=b-a
C>ну и собссно subject
Заменой знаков в предыдущем для ненулевых a и b
a=a/b;
b=a*b;
a=b/a
Здравствуйте, Pushkin, Вы писали:
P>я бы это переписал так
P>P>a=a-b;
P>b=a+b;
P>a=b-a
P>
ну тогда уж так
a -= b;
b += a;
a = b - a;
код генериться должен более эффективный
Здравствуйте, cyc10ne, Вы писали:
C>тогда и логарифм с экспонентой подойдут
Логарифм и экспонента — ln, exp — унарные операторы.
A' = A*B
B' = A'/B = (A*B)/B = A
A" = A'\B' = (A*B)\A = B
Отсюда требования к функциям:
g(f(A,B),B) = A
h(f(A,B),A) = B
f(x,y) = x^y
g(x^y,y) = x; g(f,y) = root[y] f
h(x^y,x) = y; h(f,x) = log[x] f
f(x,y) = log[x] y = ln y / ln x
g(f,y) = exp(ln y / f)
h(f,x) = exp(f / ln x)