другие решения
От: cyc10ne Россия http://sx.openbsd.ru/
Дата: 24.03.03 11:38
Оценка: 9 (1)
Всем привет.

сегодня наткнулся на задачку обмена значений двух переменных
без использования дополнительной переменной или ррегистров.

нашел два решения.


a ^= b;
b ^= a;
a ^= b;


ну ежели xor выразить через ~(a & b) & (a | b);
то запишется то же самое но чуть по другому поэтому не считается (;

второе

b -= a = (b += a) - a;


ну и собссно subject
Re: другие решения
От: UgN  
Дата: 24.03.03 11:43
Оценка: 19 (2)
Здравствуйте, cyc10ne, Вы писали:

A = A*B
B = A/B
A = A/B




А вообще, имхо, годятся любые два "противоположных" действия.
Вопрос только в реализации: потери при округлении и т.п.
Re[2]: другие решения
От: cyc10ne Россия http://sx.openbsd.ru/
Дата: 24.03.03 11:47
Оценка:
UgN>А вообще, имхо, годятся любые два "противоположных" действия.
UgN>Вопрос только в реализации: потери при округлении и т.п.

тогда и логарифм с экспонентой подойдут
Re: другие решения
От: Pushkin Россия www.linkbit.com
Дата: 24.03.03 11:50
Оценка: 12 (1)
Здравствуйте, 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
Re[2]: другие решения
От: cyc10ne Россия http://sx.openbsd.ru/
Дата: 24.03.03 12:00
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>я бы это переписал так


P>
P>a=a-b;
P>b=a+b;
P>a=b-a
P>


ну тогда уж так

a -= b;
b += a;
a = b - a;


код генериться должен более эффективный
Re[3]: другие решения
От: Кодт Россия  
Дата: 24.03.03 13:40
Оценка:
Здравствуйте, 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)
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.