Поменять местами переменные без использования третьей

Старая добрая задачка. Как поменять значения двух переменных местами? Первый вариант очевиден. Вводится третья переменная. Обмен происходит через нее. Пример для. Не представляю для кого.

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

Менее очевидно, как провернуть такую же махинацию без использования третьей переменной. Сделать это можно, например, так.

Или с помощью менее затратных побитовых операций.

Для чего это может вообще понадобится? Буфер — это ведь просто и понятно. Могу предложить вашему вниманию две причины это знать. Неплохо для разминки мозга. Это первая. Можно представить, что у вас доступно мало памяти, но нет проблем с производительностью. Это вторая.

Добавлю, что использование стэка может быть эффективно. По сути — тот же буфер. Только, скорее всего, эффективно используется на уровне архитектуры. Впрочем, есть подозрение, что оптимизирующий компилятор приведет первую конструкцию к обмену через стэк, но, понятно, не сможет вторую и третью. Он оптимизирующий, а не ясновидящий.

Если вы собираетесь использовать ассемблерную вставку при программировании на C, есть свои сложности. Вместо того, чтобы помещать в стэк непосредственно значения переменных, думаю, будет правильнее предварительно записать их в регистры. Но когда начинаешь так вмешиваться в работу программы, ни на какую помощь от компилятора рассчитывать не приходится. А ведь некоторые вещи действительно проще обсчитывать автоматически, пусть и не обязательно это эффективно. Привет вам, управляемые языки! А вот при программировании микроконтроллеров счастье управляемых языков недоступно, зато можно проявить свой талант в полной мере, все выверев самому.

Читайте также  Сжатое сообщение 5 букв

К чему это я? Даже самая простая задача требует серьезного рассмотрения, четкого определения исходных данных и целей.

Автор: san ← к списку ← →

1.
a = a + b;
b = a — b;
a = a — b;

Если Вам понравился вопрос, проголосуйте за него

Голосов: 56 Голосовать

Недавно мой старый знакомый посетовал на то, что не смог пройти собеседование на должность 1С программист. Узнав, что у него спрашивали, я задумался. Что и говорить, в его ситуации растерялся бы и я. Хотя ничего страшного в заданиях нет. Просто как-то необычно, что спрашивают алгоритмы вместо прикладных объектов.

Задача поменять местами значения переменных часто встречается при программировании. Например, без нее не обходится алгоритмы сортировки. Однако там часто используется третья буферная переменная. На С++ это будет выглядеть так:

Значения поменялись. Задача выполнена. Так рекомендуется делать. Однако есть и другие способы. Один из моих любимых это использование xor (можете ознакомиться с ним в уроках по другим языкам программирования, например по С++).

Этот метод изящен и непонятен на первый взгляд. Кроме того, исключающий ИЛИ значительно медленнее обычного свопирования (обмена) переменных через буфер.

Давайте теперь поменяем значения xorом наших переменных a и b:

Данный способ легко позволяет выполнить поставленную задачу. Почему-то, многие даже не знают, что так можно решить эту задачу.

Все хорошо, однако в 1С нет xor. Разработчики решили, что он там не нужен. Ну и бог с ним. Решим другим способом.

a=3;

b=5;

a=a+b;

b=a-b;// здесь уже будет 3

a=a-b; // а теперь равно 5

Как видите, простая математика упростила нам жизнь. Ничего сложного здесь нет. К слову, так можно делать и в других языках.

Читайте также  Случалось ли вам идти когда нибудь

Работодатель хочет быть уверенным в том, что ему попался хороший работник. Поэтому могут возникнуть подобные коллизии. Не бойтесь использовать свою логику –решайте так, как вам кажется нужным.

Я же, в свою очередь, в этом блоге постараюсь разобрать для вас всевозможные каверзные вопросы.

Ссылка на основную публикацию
Adblock
detector