## 2009. május 9., szombat

### Swapping two variables without pointers or a third one

Problem/Question/Abstract:

How to swap two integers without a temporary variable or pointers?

Solve 1:

Yes, it�s possible to swap the values of two variables without using a third one or swapping pointers.

How??? The answer is: using xor!!!

Place a label and a button on a form, and put this on Button�s click event.

procedure TForm1.Button1Click(Sender: TObject);
var
var1: integer;
var2: integer;
begin

var1 := 19;
var2 := 564;

var1 := var1 xor var2;
var2 := var1 xor var2;
var1 := var1 xor var2;

// They�re swapped!!!

Label1.Caption := 'Var1 = ' + IntToStr(var1) + '; Var2 = ' + IntToStr(var2);
end;

Solve 2:

// ========================================
// This is a FAST swap routine that swaps
// the contents of any 2 variables.
// The variables may be of any type but
// the sizeof the VARS must be passed in Len
//
// eg.  X1,X2 : integer;
//
//        SwapMem(X1,X2,SizeOf(Integer));
//
// ======================================== }

procedure SwapMem(var Source, Dest; Len: integer);
begin
asm
push edi
push esi
mov esi,Source
mov edi,Dest
mov ecx,Len
cld
@1:
mov al,[edi]
xchg [esi],al
inc si
stosb
loop @1
pop esi
pop edi
end;
end;