# 4 Zahlen, je Werteber. 0-29 ,in einer short abspeichern,wie?



## rabi (8. Dez 2004)

Wir sollen die folgende Aufgabe als Java Klasse  programmieren. Ich weiß nur nicht,  wie diese Kodierung aussehen könnte. 



Wie können vier Zahlen, die nur Werte von 0 bis 29 annehmen, in
einer einzigen short-Variable gespeichert werden?

short-Wertebereich:  -32768, ..., 32767


----------



## Manfred (8. Dez 2004)

Das ist mir dazu eingefallen:


```
public class Short {
	
	private short speicher;
	private short diffA=0;
	private short diffB=0;
	private short diffC=0;
	private short diffD=0;
	
	public void speichere(short a, short b, short c, short d)
	{
		diffA+=30-a;
		diffB+=30-b;
		diffC+=30-c;
		diffD+=30-d;
		
		speicher+= a + diffA + b + diffB + c + diffC + d + diffD;
	}
	
	public void gibZahlenAus()
	{
		short a=0;
		short b=0;
		short c=0;
		short d=0;
		
		d+=120-(90+diffD);
		c+=90-(60+diffC);
		b+=60-(30+diffB);
		a+=30-(diffA);
		
		System.out.println("a:"+a+" b:"+b+" c:"+c+" d:"+d);
	}
	
	public static void main(String args[])
	{
		Short s = new Short();
		s.speichere((short)8,(short)-7,(short)29,(short)0);
		s.gibZahlenAus();
	}

}
```


----------



## rabi (8. Dez 2004)

das ging ja schnell. ich verstehe es leider nicht. ich soll doch 4 zahlen in eine short variable abspeichern.
aus der short variable lassen sich nun die 4 zahlen ermittlen. was bewirkt die variable speicher bei dir?


----------



## Beni (8. Dez 2004)

Möchte ja kein Spielverderber sein, aber Manfred, du speicherst doch auch Informationen in diffA...D, also benutzt du eigentlich 5 shorts...


----------



## rabi (8. Dez 2004)

ich habe die aufgabe nochmal gelesen und da sheht wir sollen nur 3 zahlen in eine short variable abspeichern.( in teilaufgabe zuvor sollte man 4 zahlen (wertebereich 0..9) in einer short speichern). sorry, mein fehler .aber das  müsste jetzt doch einfacher sein, oder?


----------



## Manfred (8. Dez 2004)

Also

1.
Ich habe das so gemacht!

Es gibt 4 Wertebereicht, immer von 0 bis 30 geht also bis 120 bei 4 Zahlen.

Angenommen die erste Zahl ist 10. Ich rechne jetzt die Differenz zu 30 aus, das wäre 20. Diesen Wert muss man sich natürlich merken (diffA). Das mit jeder Zahl!

Jetzt gibts insgesamt 8 Zahlen (a,b,c,d und jeweils die Differenz auf 30)

Nun addiert man a+die Differenz  +  b+die Differenz + .... Das heisst insgesamt kommt man auf den Wert 120


Beim auslesen geht man folgendermaßen vor:
Start ist bei 120, die erste Zahl mit Differenz ist also 30

Um auf die erste Zahl zu kommen muss man folgendes tun:
120-(90+differenz)

Beispiel von oben: 120-(90+20)=10

Mir fällt gerade ein, dass eigentlich pro Zahl 30-differenz genügen würde, aber egal!



2.
Stimmt ich benutze hier 5 shorts, wenn deine Aufgabe auf einer besteht, dann ists das Beispiel nichts! Andererseits werden aber nicht die Zahlen, sondern eine Differenz auf 30 dort abgespeichert!?


PS: 
Ich seh gerade, dass ich die Var speicher, gar nicht mehr benutze im 2ten Teil! Ich hatte das anders vor, aber dann vergessen!
Im Prinzip habe ich jetzt 4 Shorts, die eine Differenz speichern
Also eigentlich sind die Werte in gar keiner Variable gespeichert ;-)

Ich werd nochmal nachdenken!


----------



## Illuvatar (8. Dez 2004)

Zahl von 0-29 braucht 5 Bit. Short hat 16. Reicht also 
Erste Zahl um 10 leftshiften, zweite um 5. Mit der Speichervariable durch binäres Oder verknüpfen.
Zum rausholen kannst du die Bits rechts nehmen, dann 5 rechtsschiften, dann wieder die 5 rechts usw.


----------



## Wildcard (8. Dez 2004)

Ich würds so machen:
Nimm von zwei zahlen die erste stelle (kann ja nur 0,1 und 2 sein).
definiere eine neue Zuordnung:

1.Zahl:
    1.Ziffer 0: 9
    2.Ziffer 1: 6
    3.Ziffer 2: 3

2.Zahl
    1.Ziffer 0: 0
    2.Ziffer 1: -1
    3.Ziffer 2: -2

jetzt addierst du die beiden Ziffern und schreibst das ergebnis als erste Ziffer.
Die Zahlen können weiterhin eindeutig zugeordnet werden und du hast eine Stelle gespart.
Der Rest ist trivial  :wink: 

@Illuvatar
Auch ne Möglichkeit, aber nicht so schön weltfremd


----------

