Просмотр полной версии : Pascal. Меняем две переменных местами.
Однажды подошел ко мне друг и спросил, как поменять две переменных местами, я не задумываясь ответил: введем третью перенную "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:
a:=a xor b;
b:=b xor a;
Странно... что то не стыкуется в этом методе. Допустим берем две величины а=1FH и b=7H... тогда согласно этим операциям мы получаем в итоге a=18H и b=1F... в случае с b это конечно сработало, но с величиной a какая то неувязочка выходит :confused: . Или это только в паскале работает? Хотя не должно, буленова математика стандартна для всех. :this:
Не прав ты, 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
Этот вопрос задают на всех собеседованиях)))
есть у архитектуры x386 интересная команда xchg.... меняет значения двух источников местами:
_asm {
push eax;
push ebx;
mov eax,0x01;
mov ebx,0x02;
xchg eax,ebx;
pop ebx;
pop eax;
}
Напомню все началось с Pascal )) А вы уже в ассемблер залезли.
Прикольно. А я про xor ничего не знал. Приду в субботу на информатику, поуминичаю :)
Powered by vBulletin, Copyright ©2000-2026, Jelsoft Enterprises Ltd.