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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2011, 13:02
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,238
Версия 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,714
Репутация: 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
Репутация: 59585
По умолчанию

я так понимаю, что 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,238
Версия 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,238
Версия 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, 19:58
Аватар для 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,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Нифига не понел.
Код:
  asm
    xor eax, eax
    xor ecx, ecx
    mov eax, $99
    mov ecx, $4B
    xor eax, ecx
    xor ecx, eax
    xor eax, ecx
    mov x, eax
    mov y, ecx
  end;
хитрую подмену сделал бы как-то так:
Код:
  asm
  .... зануливание регистров
    mov eax, x
    mov ecx, y
    mov edx, z
    mov x, edx
    mov y, eax
    mov z, eax
  end;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


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

Последний раз редактировалось M.A.D.M.A.N., 04.09.2011 в 20:05.
Ответить с цитированием
  #9  
Старый 04.09.2011, 20:34
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,238
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

У тебя 6 строк в asm, без учёта обнуления регистров. С xchg это 4 строки, как я выше написал.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #10  
Старый 04.09.2011, 21:32
Аватар для 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,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
У тебя 6 строк в asm, без учёта обнуления регистров. С xchg это 4 строки, как я выше написал.
По 3 раза
К чему вся это фалометрия?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 04.09.2011, 21:38
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,238
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Зачем по 3 раза? Я ж написал полный код...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #12  
Старый 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,503
Версия 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, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #13  
Старый 05.09.2011, 02:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну если asm, то можно и так:
Код:
  asm
    push X
    mov  eax, Y
    mov  X, eax
    pop  Y
  end;
P.S. для 2 переменных.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 05.09.2011 в 02:24.
Ответить с цитированием
  #14  
Старый 05.09.2011, 08:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

а стеком то можно сколько угодно переменных "менять местами":
Код:
var
  a, b, c, d: Integer;
begin
  a:=13;
  b:=11;
  c:=1973;
  d:=$ff;
  Edit1.Text:=IntToStr(a);
  Edit2.Text:=IntToStr(b);
  Edit3.Text:=IntToStr(c);
  Edit7.Text:=IntToStr(d);
  asm
    push a
    push b
    push c
    push d

    pop b
    pop c
    pop d
    pop a
  end;
  Edit4.Text:=IntToStr(a);
  Edit5.Text:=IntToStr(b);
  Edit6.Text:=IntToStr(c);
  Edit8.Text:=IntToStr(d);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #15  
Старый 05.09.2011, 18:28
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Стеком сколько угодно, пока не будет переполнения.
Еще один извращенский вариант:
Код:
var
   a,b,c,d,...,z:integer;
begin
 asm
  mov esi, offset z
  mov ecx, 25
  mov ebx, z
  @1:
     sub esi, 4
     mov eax, [esi]
     mov [esi+4], eax
     loop @1
  mov eax, [esi]
  mov a, ebx  
 end;
end;
Правда сработает ТОЛЬКО если эти переменные подряд объявлены и если компилятор не поменяет их порядок.
Хотя обычно компилятор такой ерундой не занимается.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 05.09.2011 в 18:32.
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter