zu blöd zum rechnen

JanHH

Top Contributor
Hallo,

brauch mal nachhilfe..

hab drei Zahlen:

a: byte
b: short
c: int

diese sollen nun binär dargestellt werden:

- acht nullen
- dann acht bit für a
- dann 16 bit für b
- dann 32 bit für c

so das man dann 64 bit (=1 long) hat.

Variante 1: Alles in einen String konvertieren und dann parsen (ich weiss der Code ist mist, ist ja auch nur rumprobieren)

Java:
		String b_a=Integer.toBinaryString(a);
		String b_b=Integer.toBinaryString(b);
		String b_c=Integer.toBinaryString(c);
		
		while(b_a.length()<8)
			b_a="0"+b_pid;

		while(b_b.length()<16)
			b_b="0"+b_vid;

		while(b_c.length()<32)
			b_c="0"+b_cid;

		String b_s="00000000"+b_a+b_b+b_c;
		long l=Long.parseLong(b_s, 2);

Der String (b_s) sieht übrigens RICHTIG aus.

Variante 2, etwas simpler und an sich korrekt: c+(b*(2^32))+(a*(2^48))

Aber bei beiden Varianten kommen unterschiedliche Werte raus!!!! Heul.

Warum, und was tun?
 
beachte zahlensysteme !

binär : XXXXXXXXb
oktal : 0XXXXXXXX
deziaml : XXXXXXXX
hexadezimal : 0xXXXXXXXX

eine FÜHRENDE 0 leitet einen OKTAL-zahl ein ...
 
Variante 3: BitShifts!
Dann das ganze noch auf Long-Basis berechnen und die vorderen 8 Bit löschen. Ausserdem: Denkst du auch an die N-Flag-Extension beim casten der Werte? Mit BitShifts wär das nicht passiert... 😉
 
Hm, Rätsel gelöst, man muss das alles hier und da noch nach long casten, dann gehts.

Uff, so viel Aufwand für sowas banales ;-).


long pow32=4294967296L;
long pow48=281474976710656L;

long id=(((long)a)*pow48)+(((long)b)*pow32)+(long)c;
 
Zuletzt bearbeitet:
Na wenn das die Lösung ist...
Trotzdem liefert [c](long) (-1 * pow32)[/c] immer noch negative Longs, weil du die N-Flag-Expansion (Expansion ist das richtige Wort 😉) nicht verhinderst. Dem folgende Additionen ändern an diesem Umstand evtl. nur zufällig was und die 8 führenden Bits werden 1 und nicht 0.
es müsste also etwa so aussehen:
long lA = a & 0xFF
long lB = b & 0xFFFF
long lC = c & 0xFFFFFFFFL (das L an dieser Stelle ist unheimlich wichtig)

nun kann man explizit positive Werte multiplizieren (so wie du es gemacht hast) oder...

long id = (lA << 48) | (lB << 32) | lC
 
Bitshift sieht ur im ersten Moment "komisch" aus.
Zur Verdeutlichung mach einfach ein paar Schritte von Hand auf Papier, dann wird sofort klar wie es funktioniert.
 

Zurück
Oben