Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   2 Variablen vertauschen (https://www.delphipraxis.net/15478-2-variablen-vertauschen.html)

HAF4ever 29. Jan 2004 15:56


2 Variablen vertauschen
 
Ich hab mir mal den Kopf darüber zerbrochen warum es nötig sein muss beim Tauschen der Werte zweier Variablen eine Hilfsvariable heranzuziehen.
:arrow: z.B.:
Code:
h:=x;
x:=y;
y:=h;
:coder: ich hab ein wenig herumgecoded und bin schließlich auf einen grünen zweig gekommen.
:arrow: hier der code:
Code:
x:=x xor y;
y:=x xor y;
x:=x xor y;

sakura 29. Jan 2004 16:21

Re: 2 Variablen vertauschen
 
Zitat:

Zitat von HAF4ever
ich hab ein wenig herumgecoded und bin schließlich auf einen grünen zweig gekommen

Nur wo ist der wirkliche Vorteil :gruebel: Der Computer muss dreimal rechnen :arrow: Zeitaufwand. In Assembler kommt Deine Lösung auf den folgenden Ansatz (X, Y sind vom Typ Integer):
Delphi-Quellcode:
  asm
    mov EAX, Y
    xor X, EAX
    mov EAX, X
    xor Y, EAX
    mov EAX, Y
    xor X, EAX
  end;
Dann doch lieber gleich so
Delphi-Quellcode:
  asm
    mov EAX, Y
    mov EBX, X
    mov Y, EBX
    mov X, EAX
  end;
...:cat:...

roderich 29. Jan 2004 16:26

Re: 2 Variablen vertauschen
 
Delphi-Quellcode:
Code:
x:=x xor y;
y:=x xor y;
x:=x xor y;
Das erinnert mich an die C-Programmierer, die auch in einer einzigen Zeile gleich ganz viel codieren können.
Damit gewinnst du vielleicht 1 Nanosekunde Ausführungszeit, dafür kann den Code in zwei Wochen keiner mehr verstehen.

choose 29. Jan 2004 16:59

Re: 2 Variablen vertauschen
 
Zitat:

Zitat von sakura
wo ist der wirkliche Vorteil :gruebel: [..] In Assembler[..]

Hallo sakura,

gerade bei der Arbeit mit der begrenzten Anzahl von Registern hat sich dieser alte ASM-Trick schon häufig bewähren können, ohne zusätzlich mit dem Stack oder einer Variablen arbeiten zu müssen, falls zwei GP-Register ausgetauscht werden sollten (hier EAX und EBX), was wesentlich (zeit-)aufwendiger wäre:
Code:
xor  EAX, EBX
xor  EBX, EAX
xor  EAX, EBX

Neg 29. Jan 2004 20:58

Re: 2 Variablen vertauschen
 
Der Kontrast zwischen dieser Lösung und deiner Signatur könnte kaum größer sein... :roll:

glkgereon 26. Mai 2004 15:58

Re: 2 Variablen vertauschen
 
könnte das einer für mich nichtassembler mal erklären?

was soll dieses y:= x xor y und so?

imn voraus: ich weiss was xor ist!!!

negaH 26. Mai 2004 16:40

Re: 2 Variablen vertauschen
 
Dann solltest du auch deine Frage selber beantworten können ;)

Gruß Hagen

glkgereon 26. Mai 2004 17:50

Re: 2 Variablen vertauschen
 
hä?

das heisst für mich:

Delphi-Quellcode:
x:= x oder y;
y:= x oder y;
x:= x oder y;
also oder heisst jetzt xor
aber wqarum sollte das vertauschen;

zb x:=x xor y, woher soller wissen ob jetzt x:=x oder x:=y????? :gruebel:

phXql 26. Mai 2004 17:57

Re: 2 Variablen vertauschen
 
xor ist kein normales oder (or), sondern ein exklusives oder (macht nen unterschied ;))

Chewie 26. Mai 2004 17:58

Re: 2 Variablen vertauschen
 
Mal dir einfach die Bitmuster auf ein Blatt und vollzieh den Tauschvorgang nach.

Luckie 26. Mai 2004 17:58

Re: 2 Variablen vertauschen
 
Nicht oder, sonder nicht oder.

Code:
x = 1010
y = 1011

x: 1010
y: 1011  xor
-------
x= 0100

x: 0100
y: 1011 xor
-------
y= 0000

x: 0100
y: 0000 xor
-------
x= 1011
Somit hätte x den Wert von y. Nur ist da bei mir gerade der Wert von y auf der Strecke geblieben. :gruebel:

Chewie 26. Mai 2004 18:00

Re: 2 Variablen vertauschen
 
Ähm, Luckie, ich weiß nicht, welche Operation du da jetzt ausgeführt hast, aber in XOR ist das definitiv nicht...

Halt, jetzt sehe ich es, es ist ein NAND ;)

Edit: Blödsinn, ich mein natürlich NOR :wall:

glkgereon 26. Mai 2004 18:02

Re: 2 Variablen vertauschen
 
ich kapier das zwar grundsätzlich, aber ich dachte xor wär das:

bedingung:

if (x=1) xor (y=2)...

ist gleich

if ((x=1) and (y<>2)) or ((x<>1) and (y=2))...

oder nit :gruebel: :gruebel: :gruebel:

ich mein man kann ja auch nit sagen x=x and y, oder?

Chewie 26. Mai 2004 18:06

Re: 2 Variablen vertauschen
 
Ersetze das "ist gleich" durch "ist äquivalent", und wir sind im Geschäft ;)

Das ist aber nicht die Definition von xor, sondern eine Anwendung.
xor ist zunächst eine Operation, die zwei Bit-Operanden hat. Das Ergebnis dieser Operation ist nun 1, falls genau ein Bit 1 ist und sonst 0.

Folgende Beispiele sollten es verdeutlichen:

Code:
01011 xor
10101
-----
11110

00101 xor
11100
-----
11001
Du kannst es auch als Addition ohne Berücksichtigung des Übertrags ansehen.

CalganX 26. Mai 2004 18:06

Re: 2 Variablen vertauschen
 
Öhm... Luckie? :gruebel:

Code:
x = 1010
y = 1011

x: 1010
y: 1011  xor
-------
x= 0001

x: 0001
y: 1011 xor
-------
y= 1010

x: 0001
y: 1010 xor
-------
x= 1011
Wäre wohl richtiger. :lol: ;)

Chris

Ultimator 26. Mai 2004 18:07

Re: 2 Variablen vertauschen
 
D.h. sind zwei bits gleich, so ist das Ergebnis Null, anderenfalls ist es Eins.

Chewie 26. Mai 2004 18:09

Re: 2 Variablen vertauschen
 
Zitat:

Zitat von Ultimator
D.h. sind zwei bits gleich, so ist das Ergebnis Null, anderenfalls ist es Eins.

Bingo :thuimb:
Deswegen nennt man das Ding auch "Ambivalenzoperator", weil es ausdrückt, ob zwei Werte verschieden sind oder nicht. Die negierte Version davon, also das XNOR, wäre dann der "Äquivalenzoperator".

glkgereon 26. Mai 2004 18:11

Re: 2 Variablen vertauschen
 
kann ich denn jetzt sagen

x:= x and y???

Chewie 26. Mai 2004 18:13

Re: 2 Variablen vertauschen
 
Klar kannst du das sagen, die Frage ist nur, was du damit ausdrücken willst :gruebel:

negaH 26. Mai 2004 18:28

Re: 2 Variablen vertauschen
 
Zitat:

imn voraus: ich weiss was xor ist!!!
Tja, anscheindend doch nicht ;)

Gruß Hagen

Luckie 26. Mai 2004 18:40

Re: 2 Variablen vertauschen
 
Zitat:

Zitat von Chewie
Das ist aber nicht die Definition von xor, sondern eine Anwendung.
xor ist zunächst eine Operation, die zwei Bit-Operanden hat. Das Ergebnis dieser Operation ist nun 1, falls genau ein Bit 1 ist und sonst 0.

Hm. Und wo ist dann der Unterschied zu or?

Code:
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0
1 or 1 = 1
Haaaa, habs:

Code:
1 xor 1 = 0
oder?

Zitat:

Du kannst es auch als Addition ohne Berücksichtigung des Übertrags ansehen.
Das ist eine gute Erklärung.

CalganX 26. Mai 2004 18:44

Re: 2 Variablen vertauschen
 
Hi,
Zitat:

Zitat von Luckie
Haaaa, habs:

Code:
1 xor 1 = 0
oder?

jepp. ;)

Chris

gmarts 26. Mai 2004 20:47

Re: 2 Variablen vertauschen
 
or = oder
xor = entweder, oder


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz