Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2011, 13:02
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию Обмен значениями без третьей переменной

Очень хороший метод нашёлся в просторах Сети:
Код:
var
  x, y: byte;
begin
  x:=$99; // bin 10011001
  y:=$4B; // bin 01001011
  
  x:=x xor y; // 11010010
  y:=y xor x; // 10011001
  x:=x xor y; // 01001011
end;
А теперь вопрос на логику - как "свапнуть" три значения?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #2  
Старый 04.09.2011, 13:15
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Что-то мне подсказывает, что свапнуть 3 значение в классическом случае нельзя, т.к. неясно какое значение куда свапать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 04.09.2011, 13:18
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

А конкретно? 3 переменных: А, B, С, поменять A <-> C, а с переменной B что делать?
Кстати обмен чисел (2 переменных):
Код:
var
  a, b: Integer;
begin
  a := 2;
  b := 3;

  a := a+b;
  b := a-b; // b = 2
  a := a-b; // a = 3
Кстати вот задачка не по теме: сравнить и вывести большее число без использования if, while, for. В С это решилось бы проще, а вот в паскале...
ЗЫ решение для паскаля:
Код:
WriteLn('Большее число = ',  (a+b + abs(a-b))/2:0:0);
__________________
Помогаю за Спасибо
Ответить с цитированием
  #4  
Старый 04.09.2011, 13:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

я так понимаю, что A -> B, B -> C, C -> A
XCHG рулит)))
добавлено позже
Код:
var
  a, b: Integer;
begin
  a := 2;
  b := 3;

  a := a+b;
  b := a-b; // b = 2
  a := a-b; // a = 3
можно переполнение a+b схватить
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 04.09.2011 в 13:33.
Ответить с цитированием
  #5  
Старый 04.09.2011, 13:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

ну, можно и на xchg сделать
Да, именно
Цитата:
A -> B, B -> C, C -> A
В моём случае это
Код:
    x:=x xor y;
    y:=y xor x;
    x:=x xor y;

    z:=z xor y;
    y:=y xor z;
    z:=z xor y;
В случае с xchg:
Код:
  xchg ax,bx
  xchg bx,cx
P.S. а asm-то рулит
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 04.09.2011, 13:50
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну, а если быть совсем точным:
Код:
  // x <=> y
  asm
    mov eax,y
    xchg x,eax
    mov y,eax
  end;

  // x <= y <= z
  asm
    mov eax,y
    xchg x,eax
    xchg z,eax
    mov y,eax
  end;

  // x => y => z
  asm
    mov eax,y
    xchg z,eax
    xchg x,eax
    mov y,eax
  end;
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 04.09.2011 в 13:53.
Ответить с цитированием
  #7  
Старый 04.09.2011, 19:25
einstein einstein вне форума
Начинающий
 
Регистрация: 02.09.2010
Адрес: Город
Сообщения: 143
Репутация: -4653
По умолчанию

через стек можно. изменяя очередность пушей и попов.
Ответить с цитированием
  #8  
Старый 04.09.2011, 21:52
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Ну, а если быть совсем точным:
Код:
  // x <=> y
  asm
    mov eax,y
    xchg x,eax
    mov y,eax
  end;

  // x <= y <= z
  asm
    mov eax,y
    xchg x,eax
    xchg z,eax
    mov y,eax
  end;

  // x => y => z
  asm
    mov eax,y
    xchg z,eax
    xchg x,eax
    mov y,eax
  end;
Оное чтоли?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter