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?

Answer:

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;

Nincsenek megjegyzések:

Megjegyzés küldése