• Александр Черный
  • Блог
  • Проекты
  • О себе
  • RSS
28 августа 2010

Как поменять переменные местами?

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

    int a = 1;
    int b = 2;
    int c = 0;

    c = a;
    a = b;
    b = c;

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

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

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

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

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

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

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

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

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

аглоритмы   

Ваш комментарий


(не будет опубликован)


© Александр Черный, 2009–2023

Служебный вход

Работает на YAPSE, β