# Inhalte zweier Variablen tauschen



## TimWischmeier (24. Nov 2004)

Hallo zusammen,

ich studiere Info im ersten Semester und komme bisher auch sehr gut mit, da ich mich vorher schon recht gut mit Java ausgekannt hab. Wir bekommen also wöchentlich Übungszettel, und auf diesem steht eine Frage, zu der mir nicht so viel einfällt:

Wie kann man die Inhalte zweier Variablen tauschen, ohne eine dritte Variable zu Hilfe zu nehmen? Nennen sie Bedingungen und Ablauf sowie mindestens zwei Möglichkeiten.

Also eine hätte ich:
Tausch int <-> int (oder ähnliches, also char  und bei flot etc. müsste das mit Einschränkungen auch gehen).

```
int a = 7;   //müssten so circa in der Hälfte des Wertebereichs für ints liegen, a und b
int b = 8;

a += b;   // a = 15
b -= a;    // b = -7
a += b;   // a = 8
b *= -1;   // b = 7
```
Das würde funktionieren. Hat jemand noch Anregungen oder andere Ideen, die er mir auch erklären kann? Es muss nicht auf sowas wie Effizienz geachtet werden, sondern es geht erstmal nur um die Idee an sich.

Vielen Dank für eure Hilfe / Mühe ,
MfG,
Tim


----------



## Student (24. Nov 2004)

mach 'a' zu einem String. hänge b an. weise b das erste zeichen von 'a' zu.

;-)

ungetestet.


----------



## TimWischmeier (24. Nov 2004)

Student hat gesagt.:
			
		

> mach 'a' zu einem String. hänge b an. weise b das erste zeichen von 'a' zu.
> 
> ;-)
> 
> ungetestet.




Zwei Probleme:
1. wir kennen offiziell noch keine Strings, also ist diese Möglichkeit nicht in der "Lösungsmenge" ;-)
2. Du brauchst doch wohl irgendwie eine Variable die sich den String merkt, sonst kriegst du das net gebacken .
Aber trotzdem Danke für deine Antwort!


----------



## dotlens (24. Nov 2004)

```
a = 6;
b = 8;

a = a * b; // a = 48
b = a / b; // b = 6
a = a / b; // a = 8
```

gefällt mir, diese aufgabe 
auch wenn sie nicht viel sinn macht


----------



## Student (24. Nov 2004)

TimWischmeier hat gesagt.:
			
		

> 2. Du brauchst doch wohl irgendwie eine Variable die sich den String merkt, sonst kriegst du das net gebacken!


wieso?

es war nicht davon die rede, dass die variable nicht den datentyp 'wechseln' darf ^^


----------



## Bleiglanz (24. Nov 2004)

```
// funzt für double,float,int,long
if(a<=b)
{
    a=Math.max(a,b);b=Math.min(a,b);
}
else
{
    b=Math.min(a,b);a=Math.max(a,b);
}
```
Meinst du nur primitive Datentypen oder auch Object's?


----------



## dotlens (24. Nov 2004)

Student hat gesagt.:
			
		

> es war nicht davon die rede, dass die variable nicht den datentyp 'wechseln' darf ^^


den Datentyp wechseln??!!?? kannst du mir mal erklären wie das geht


----------



## Student (24. Nov 2004)

dotlens hat gesagt.:
			
		

> Student hat gesagt.:
> 
> 
> 
> ...



*hust* ;-)

ich muss weg ...  8)  muuhahahha^^


----------



## dotlens (24. Nov 2004)

Student hat gesagt.:
			
		

> *hust* ;-)
> 
> ich muss weg ...  8)  muuhahahha^^


dacht ichs mir doch  :bae:


----------



## Sky (24. Nov 2004)

Bleiglanz hat gesagt.:
			
		

> ```
> // funzt für double,float,int,long
> if(a<=b)
> {
> ...



Ich glaube nicht, dass deine zuverlässig Lösung geht. 

Denn wenn z.B. a=5 und b=7, dann wird durch 'a=Math.max(a,b)' der Variablen a der Wert '7' zugewiesen. Das Ergebnis von 'b=Math.min(a,b);' ist dann auch gleich '7', weil hier aus '7' und '7' das Minimum ermittelt werden soll.


----------



## pogo (24. Nov 2004)

```
a = 7;
b = 8;

a = a+b;  //a = 7+8 = 15
b = a-b;  //b = 15-8 = 7
a = a-b;  //a = 15-7 = 8
```
fertig


----------



## Bleiglanz (24. Nov 2004)

jo, das ist wirklich totaler käse 


Muss wohl

```
if(a<=b)
a=Math.max(b=Math.min(a,b),a);
```
heissen, geht dass denn wenigstens?


----------



## Sky (24. Nov 2004)

Bleiglanz hat gesagt.:
			
		

> jo, das ist wirklich totaler käse
> 
> 
> Muss wohl
> ...



Auch das dürfte nicht gehen :
- a ist kleiner als b
- das Min. aus a und b ist somit a (dies wird b zugewiesen)
- dann wird a und b verglichen (beide haben den Min.-Wert angenommen)
- der Max-Wert aus 'b=Math.min(a,b),a' ist immer gleich a für a < b

Den Fall a == b (wird auch über das if geregelt) habe ich nicht betrachtet, da es da nix zum Tauschen gibt.


----------



## Reality (24. Nov 2004)

```
public class  Test{
       public  static  void main(String args[]) {
               int a = 8;
               int b = 0;
               
               int tmp = 0;
               
               if((a | b) != a && (a & b) != a){
                     tmp = (a | b) ^ b;
                     a = (b | a) ^ a;
                     b = tmp;
               }
               
               else if((a & b) != a){
                tmp = (a | b);
                b = tmp;
                a = (b | a) ^ a;
               }
               
               else{
                tmp = (a & b);
                a = (a | b);
                b = tmp;
               }


               
               System.out.println(a);
               System.out.println(b);

       }


}
```

EDIT: Hab nun doch eine dritte Variable genommen. 
Ich bin mir aber ziemlich sicher, dass es eine gute Methode mit nur 2 Variablen mit solchen Verknüpfungen gibt.

Liebe Grüße
Reality


----------



## pogo (24. Nov 2004)

nimm doch einfach die, die ich weiter oben schon geschrieben hab. die tauscht ganz einfach die 2 variablen


----------



## Bleiglanz (24. Nov 2004)

mein Hirn! hilfe! kann nicht mehr denken

```
if(a<=b)
{
    a=Math.max(b,b=Math.min(a,b));
}
else
{
    b=Math.max(a,a=Math.min(a,b));
}
```


----------



## Sky (24. Nov 2004)

Bleiglanz hat gesagt.:
			
		

> mein Hirn! hilfe! kann nicht mehr denken
> 
> ```
> if(a<=b)
> ...



 :toll: So stimmt es  :toll:


----------



## TimWischmeier (24. Nov 2004)

:toll: Vielen Dank für Eure Hilfe bis hierhin!!! :toll: 

damits übersichtlich bleibt, fasse ich noch einmal zusammen:
Getauscht werden sollen primitive Datentypen, keine Objekte. Also auch keine Strings. Methoden aus Math dürfen benutzt werden, sonst keine. Bisher sind 3 Möglichkeiten gefunden worden:

1.

```
int a = 7;
int b = 8;

a += b;   // a = 15
b -= a;    // b = -7
a += b;   // a = 8
b *= -1;   // b = 7
```

2. (dotlens)

```
int a = 6;
int b = 8;

a = a * b; // a = 48
b = a / b; // b = 6
a = a / b; // a = 8
```

3. (Bleiglanz)

```
if(a<=b)
{
    a=Math.max(b,b=Math.min(a,b));
}
else
{
    b=Math.max(a,a=Math.min(a,b));
}
```

Ich muss sagen, vor allem die 3. Methode gefällt mir, die ist schön trickreich. Gibts noch mehr kreative Leute hier ?


----------



## Bleiglanz (25. Nov 2004)

```
a = b + 0*(b=a); // von links nach rechts ausgewertet
```
leider wieder nur für zahlen


----------

