Foxter.ru

Foxter.ru (https://www.foxter.ru/index.php)
-   Программирование (https://www.foxter.ru/forumdisplay.php?f=60)
-   -   Pascal. Меняем две переменных местами. (https://www.foxter.ru/showthread.php?t=188)

wary 07.11.2005 13:24

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:

Kostyan 07.11.2005 20:13

Цитата:

Сообщение от wary
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.
Цитата:

Сообщение от 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 ничего не знал. Приду в субботу на информатику, поуминичаю :)


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

Powered by vBulletin
Copyright ©2000-2024, Jelsoft Enterprises Ltd.