|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Обмен значениями без третьей переменной
Очень хороший метод нашёлся в просторах Сети:
Код:
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
|
||||
|
||||
Что-то мне подсказывает, что свапнуть 3 значение в классическом случае нельзя, т.к. неясно какое значение куда свапать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
А конкретно? 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 ЗЫ решение для паскаля: Код:
WriteLn('Большее число = ', (a+b + abs(a-b))/2:0:0); Помогаю за Спасибо |
#4
|
||||
|
||||
я так понимаю, что 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 Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 04.09.2011 в 13:33. |
#5
|
||||
|
||||
ну, можно и на xchg сделать
Да, именно Цитата:
Код:
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 ax,bx xchg bx,cx Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
||||
|
||||
Ну, а если быть совсем точным:
Код:
// 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
|
|||
|
|||
через стек можно. изменяя очередность пушей и попов.
|
#8
|
||||
|
||||
Нифига не понел.
Код:
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
|
||||
|
||||
У тебя 6 строк в asm, без учёта обнуления регистров. С xchg это 4 строки, как я выше написал.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
||||
|
||||
Цитата:
К чему вся это фалометрия? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
||||
|
||||
Зачем по 3 раза? Я ж написал полный код...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#12
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#13
|
||||
|
||||
Ну если asm, то можно и так:
Код:
asm push X mov eax, Y mov X, eax pop Y end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 05.09.2011 в 02:24. |
#14
|
||||
|
||||
а стеком то можно сколько угодно переменных "менять местами":
Код:
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
|
||||
|
||||
Стеком сколько угодно, пока не будет переполнения.
Еще один извращенский вариант: Код:
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. |