PDA

Просмотр полной версии : Pascal. Меняем две переменных местами.


wary
07.11.2005, 13:24
Однажды подошел ко мне друг и спросил, как поменять две переменных местами, я не задумываясь ответил: введем третью перенную "c" и проведем такие вот действия:
c:=a;
a:=b;
b:=c;
Тогда он спросил, как это сделать без введения третьей переменной. После минуты раздумья я вот что сказал:
a:=a+b;
b:=a-b;
a:=a-b;
Но на вопрос, как сделать это в две операции я ответить не смог. Тогда он мне показал:
a:=a xor b;
b:=b xor a; Вроде так.
Я знаю, что операция xor означает "исключающее или", но забавно, что и переменные местами меняет и быстро и непонятно. :fool:

Kostyan
07.11.2005, 20:13
a:=a xor b;
b:=b xor a;

Странно... что то не стыкуется в этом методе. Допустим берем две величины а=1FH и b=7H... тогда согласно этим операциям мы получаем в итоге a=18H и b=1F... в случае с b это конечно сработало, но с величиной a какая то неувязочка выходит :confused: . Или это только в паскале работает? Хотя не должно, буленова математика стандартна для всех. :this:

zQrd
08.11.2005, 11:12
Не прав ты, wary.
a:=a xor b;
b:=b xor a; Вроде так. Ключевое слово здесь вроде.

В две операции обменять значения невозможно. Ты пытался привести здесь такой код:
var
X1, X2: Byte;
begin
X1 := X1 xor X2;
X2 := X1 xor X2; // X2 = X1
X1 := X1 xor X2; // X1 = X2
end.

Это самый быстрый способ обмена. И самый красивый.
Чтоб понять, как это работает, советую посидеть с ручкой и листочком и вручную проверить.

Vadya corp.
08.11.2005, 12:23
На самом деле работает вот так:
a=1;b=2;
a=a xor b;//a=3 b=2
b=a xor b;//a=3 b=1
a=a xor b;//a=2 b=1

pepper009
08.11.2006, 20:02
А в C++ можно в одну строчку:
a=b+(b=a)-a;

elkozlova
20.10.2007, 16:52
Этот вопрос задают на всех собеседованиях)))

Kostyan
21.10.2007, 02:15
есть у архитектуры x386 интересная команда xchg.... меняет значения двух источников местами:

_asm {
push eax;
push ebx;
mov eax,0x01;
mov ebx,0x02;
xchg eax,ebx;
pop ebx;
pop eax;
}

Arlikin
08.12.2007, 20:26
Напомню все началось с Pascal )) А вы уже в ассемблер залезли.

Хакер2
12.12.2007, 15:36
Прикольно. А я про xor ничего не знал. Приду в субботу на информатику, поуминичаю :)