Как стать автором
Обновить

Комментарии 28

Да, еще в школе об этом рассказывают.
Повезло вам со школой, мне основные знания о программировании как-то без школы пришлось получать.
=)
цэ нервно курит в стороне
Полузачот решению, при a=a+b может быть переполнение.
Надо делать через xor
С нетерпением ждем топика про то, как написать «хелоу ворлд».
Про переполнение и исключающее или заметили правильно выше.
Разумеется, это ;)
ok, в следующий раз напишу про Hello World, хотя на википедии вроде про него уже все написано ;)
Что-то мне подсказывает что даже mov'ов здесь больше будет чем с 'c', не говоря уже про сложение с вычитанием =) Мне больше нравятся аппаратные функции swap.
НЛО прилетело и опубликовало эту надпись здесь
На python аналогично :)
Тільки для програмування це не вигідне за часом, програш пам'яті на одну змінну значно менший за програш за часом.
Із зайвою змінною виконується 3 дії, а без неї - аж 6, тобто вдвічі більше.
Та й ідея не нова.
Тому незалік. Чекаємо наступних рішень! ;)
НЛО прилетело и опубликовало эту надпись здесь
Извините, постараюсь избегать далее. На такую реакцию я и ожидал. Просто это сложновато. :)
Тепер перевод сказанного.

Только для программирования это невыгодно по времени, поригрыш памяти на одну переменную значительно меньший проигрыша по времени.
С лишней переменной выполняется 3 действия, а без нее - целых 6, т.е. в два раза больше.
Да и идея не нова.
Поэтому незачет. Ждем следующих решений!

ПС. Решение с xor уже лучше, но оно вылетает в некоторых случаях, сейчвас, правда, не помню, в каких...
А как вы оцениваете проигрыш памяти? Почему считаете что он меньше? Программировать ведь можно не только под PC с их гигабайтами ;-)

PS пойду учить украинский.
Дерзайте, удачи! ;)

Сколько байт занимает переменная каждого типа, думаю, вы и так знаете.
А оценка хотя бы по отношению: времени в два раза меньше, а памяти больше только в полтора. :)

ПС. Я занимаюсь олимпиадным программированием, поэтому экономия времени важнее. В других сферах, возможно, по-другому.
Оценивать можно лишь относительно задачи и оборудования. Если операция делается за 10 миллисекунд, а можно делать и за 200, но при этом памяти мало — будешь оптимизировать в эту сторону. Ну и наоборот.
А в олимпиадах еще экономия времени написания важна, да и там PC, вряд ли память так критична.
действительно, не стоит забывать что вы имеете дело с москалями
Как можно было догадаться писать на украинском языке на русскоязычном портале?
это была порверка на понимаемость. проверка не удалась. :(
Вполне удалась, мне кажется. Абсолютно точно показало что неуважение (в виде заведомо неудобочитаемого для большинства аудитории текста) влечет за собой негатив.
Такое решение прокатит только с numeric-значениями.
А к чему весь сыр-бор? Где у нас остались места, в которых нельзя втыкнуть 3-ью переменную? Разве что MK-61...
А это что за зверь такой?
Ждал в первых комментариях вариацию на тему с использованием *,/
Был одним из тех, кто догадался как это сделать. Хотя сейчас, вещи чуть более сложные этой, порой, вызывают серьезные затруднения. :))
респект. Я чувствую что и за 15-30 минут не догадался бы ;)
На уровне ассемблера вы все равно ничего не выигрываете, скорее наоборот. Для того, чтобы произвести указанную операцию, требуется минимум один свободный регистр и три операции: add, sub, sub, ну и ещё сколько-то mov.

Если же писать с третьей переменной, то вполне можно ожидать, что компилятор заметит, что третья переменная не используется больше нигде и вынесет её в регистр, а саму операцию заменит на xchg. Итого получится: загрузили одну переменную в регистр, xchg с другой переменной, записали регистр в переменную.

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

PS. Только что проверил (GCC 4.1.2). Способ с тремя переменными GCC компилирует как 4 mov используя 2 регистра, под третью переменную память не выделяется.

Описанный в статье способ: add, sub, sub, 6 штук mov. Используется 4 регистра, правда недостатка в регистрах нет.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории