![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; ![]() |
|
#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 ![]() |
|
#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;Последний раз редактировалось PhoeniX, 04.09.2011 в 13:53. |
|
#7
|
|||
|
|||
|
через стек можно. изменяя очередность пушей и попов.
|
|
#8
|
||||
|
||||
|
Цитата:
|