Здравствуйте, Bora, Вы писали:
B>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?
Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).
a ^= b ^= a ^= b
Что эквивалентно:
a = a xor b
b = a xor b
a = a xor b
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, krasin, Вы писали:
K>Здравствуйте, xtile, Вы писали:
X>>Это задача на навыки владения поиском по rsdn.
K>Для тех кому задача показалась простой, уточняем: переменные типа Object
Ну, для каждого типа Object можно сделать тоже самое, используя "грязные" reinterpret_cast'ы необходимое количество раз (для каждого типа определяется во время компиляции ==> никаких переменных.
Могу написать шаблон на С++.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, krasin, Вы писали:
K>Здравствуйте, xtile, Вы писали:
X>>Это задача на навыки владения поиском по rsdn.
K>Для тех кому задача показалась простой, уточняем: переменные типа Object
К тому же, в таком случае очень полезно уточнить, что такое "поненять местами" для типа Object. И это даже не вопрос семантики (value, reference), а вопрос консистентности.
Допустим, соблюдается:
a == peer[index(&a)];
b == peer[index(&b)];
Ну, и как здесь "поменять местами"?!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, fAX, Вы писали:
fAX>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).
XOR кстати лучше. Т.к. если использовать +/- то можно просто и переполнение получить! Если числа будут довольно большие Потому XOR рулит! Задача кстати элементарная
Best regards, p_kolya. WinAmp сообщает: Тишина — лучшая музыка
fAX>>Ну, и как здесь "поменять местами"?!
K>Поясните, пожалуйста, что имеется ввиду?
Имеется в виду то, что не всегда обмен "содержимого" объектов приводит к легальному результату. Возьмите (гипотетически) Java — совсем не уверен, что такой обмен возможен из-за garbage collector'a.
А бывают ещё языки в которых нельзя вообще изменить значение после инициализации. Тут вообще затронут вопрос гораздо более серьёзный: что считать совместимыми типами. 1..10 и 3..12 — одинаковый тип. А если язык weakly-typed? и там вместе со значением хранится тип? А может ещё храниться флаг, если значение — часть структуры. Ну и как тут поменять целое, которое "само по себе" и целое, которое является полем структуры?
Кстати, в том же С++, думается, со множественным наследованием можно начудить что не все объекты будут взаимозаменяемы.... (Hint: virtual table во время различных casting-ов).
Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
fAX>Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!
Будем считать, что переменные, значения которых надо поменять, являются локальными переменными типа Object (так как это понимается в Java или C#).
Тогда не ставится вопрос целостности и взаимозаменяемости, т.к. всегда возможна стандартная форма обмена:
Object a, b, temp;
...
temp = a;
a = b;
b = temp;
Будем считать, что у кода нет permission на unsafe context, т.е адресная арифметика не может быть использована. В такой постановке вопроса, я не вижу как поменять значения двух переменных без использования третьей, в то время как смысл такой замены есть.
Здравствуйте, krasin, Вы писали:
fAX>>Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!
хъ
K>Будем считать, что у кода нет permission на unsafe context, т.е адресная арифметика не может быть использована. В такой постановке вопроса, я не вижу как поменять значения двух переменных без использования третьей, в то время как смысл такой замены есть.
Как раз это-то и зависит от операций над объектами! Ведь в примерах выше никто не лез во внутреннее представление int'а.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, p_kolya, Вы писали:
fAX>>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или). _>XOR кстати лучше. Т.к. если использовать +/- то можно просто и переполнение получить! Если числа будут довольно большие Потому XOR рулит! Задача кстати элементарная
Да и хрен с нит с переполнением, на целых числах оно ни на что не повлияет. Учите матчасть, "операции сложения и вычитания в дополнительном коде".
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, krasin, Вы писали:
K>Для тех кому задача показалась простой, уточняем: переменные типа Object
угу, писать на шарпе. Кому мало, писать на сэйф шарпе, вот тогда то мы повеселимся
Здравствуйте, krasin, Вы писали:
K>Здравствуйте, xtile, Вы писали:
X>>Это задача на навыки владения поиском по rsdn.
K>Для тех кому задача показалась простой, уточняем: переменные типа Object
Что за тип такой — Object ? Из паскаля, чтоль ? Тогда нужно определить конструктор копирования и оператор = (давно с паскалем не имел дела, не уверен вообще в возможности переопределения операторов в нем).
Дальше, составные классы всегда состоят из простых типов, и всегда можно переопределить ^ (xor) для класса так, чтобы xor'ились отдельно эти простые элементы.
Возможно я что-то недопонял, тогда распишите подробнее.
Здравствуйте, fAX, Вы писали:
fAX>Здравствуйте, Bora, Вы писали:
B>>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной? fAX>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или). fAX>
fAX>a ^= b ^= a ^= b
fAX>
fAX>Что эквивалентно: fAX>
fAX>a = a xor b
fAX>b = a xor b
fAX>a = a xor b
fAX>
Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление!
Правильно так:
if A <> B
then begin
A := A xor B;
B := A xor B;
A := A xor B;
end;
З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4
Здравствуйте, mkopachev, Вы писали:
M> Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление! M>З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4
Потому что нефиг было изображать кулькодеров. Сделали бы через промежуточную переменную, и было бы им щастье.
(Это к вопросу о практической пользе таких задачек).
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, mkopachev, Вы писали:
M>> Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление! M>>З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4
К>Потому что нефиг было изображать кулькодеров. Сделали бы через промежуточную переменную, и было бы им щастье. К>(Это к вопросу о практической пользе таких задачек).
Солидарен