Andere Interpretation eines Typs

Status
Nicht offen für weitere Antworten.

kopfsalat

Bekanntes Mitglied
Hi, ich suche eine Möglichkeit, z.B. die Bitfolge eines int-Wertes als float-Wert zu interpretieren, aber ohne den Wert in den anderen Typ umzuwandeln, sondern lediglich die Bitfolge anders zu interpretieren.
Dies ist in nicht streng typisierten Sprachen ja z.B. per undiscriminated Union-Types möglich, oder per direkter Speicherzugriffe.

Gibt es ähnliches in Java ? Habe nichts dergleichen in den Java-Docs / im Forum finden können.
 
Na sowas???

@Beni: wozu gibts denn die Methode? kann doch nichts sinnvolles dabei rauskommen???

Float.intBitsToFloat(42) ist zum Beispiel 5.9E-44??
 
@Beiglanz:
Und in wie fern macht das jetzt keinen Sinn?
5.9E-44 ist doch in Ordnung.
DataInputStream und DataOutputStream arbeiten z.b. damit.
 
@Bleiglanz
raeusper.gif

Nur weil Du keinen Verwendungszweck in einer Methode siehst, muss das nicht heissen, dass sie keinen Sinn macht.

Wie denkst du kann man einen Float schnell aus einer Datei laden?

Man liest zuerst 4 Bytes, bastelt sie zu einem Integer zusammen, und wandelt den Int in einen Float um (mit oben genannter Methode).

Vorteil: Man muss aus einer Datei nur Bytes lesen können, und kann trotzdem 0.123f speichern.

Ich empfehle dazu ein paar Codeausschnitte aus DataInput/OuputStream:
Code:
public final float readFloat() throws IOException {
	return Float.intBitsToFloat(readInt());
}

Code:
public final void writeFloat(float v) throws IOException {
	writeInt(Float.floatToIntBits(v));
}

Nicht sehr viel Programmieraufwand, hm? Und dabei wird doch eine total sinnlose Methode verwendet...

[Edit: Ich hab mal zählen lassen: floatToIntBits wird 25, intToFloatBits 17 mal in den Standartklassen verwendet 8) ]
 
@Beni
Danke! (Hätte ich auch mal bei Float, und nicht nur bei Integer nachgucken sollen 🙂 )

Weitere Verwendungszwecke:
- Bitoperationen auf Floats, oder
- manuelles Auslesen des Floats, z.B. sowas in der Art (btw: gibt es eigentlich kein RSet/LSet in Java?) :
Code:
// needs StringEx for correct formatted output

class Floatbits
{
	public static void main (String [] args)
	{
		float f  = 0.5f;
		
		int sign     = ((Float.floatToIntBits(f) & 0x80000000) >> 31) & 1;
		int exp      = ((Float.floatToIntBits(f) & 0x7F800000) >> 23) - 127;
		int mantisse = (Float.floatToIntBits(f)  & 0x7FFFFF);
		
		System.out.println("32-Bit-Float-Value                :     "    + f);
		System.out.println("32-Bit-Float-Bits                 :     "    + StringEx.RSet(Integer.toBinaryString(Float.floatToIntBits(f)), 32, "0"));
		System.out.println("sign, [0='+' | 1='-']             :     "    + sign);
		System.out.println("exponent to base 2                :     "    + exp);
		System.out.println("(hidden bit) + mantisse to base 2 :     (1)" + StringEx.RSet(Integer.toBinaryString(mantisse), 23, "0"));
	}	
}
- Ähnlich für das manuelle Erstellen von Floats.

- Oder für Verschlüsselungen (...nur als Idee):
irgendwo darin einen int-Wert als float interpretieren, um dann damit fortzufahren. Sollte wohl unmöglich sein, dafür einen 'abkürzenden' Algorithmus zu entwickeln.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben