![]() |
Bitmuster eines Single Berechnen
Hossa ich will das Bitmuster eines singles berechnen und als String ausgeben
dabei habe ich mir gedacht mache ich das so :
Delphi-Quellcode:
nur kommt da leider nicht das Richtige raus, habt ihr ne Idee ?
Function BinFtoString(d: single): String;
Var i, j: integer; k: ^integer; Begin result := ''; k := @d; j := k^; For i := 0 To 31 Do Begin If (j And $70000000 = $70000000) Then result := result + '1' Else result := result + '0'; j := j Shl 1; End; End; |
Re: Bitmuster eines Single Berechnen
Du weist schon das ein single ein floatingpoint datentyp ist?
Wikipedia: Zitat:
|
Re: Bitmuster eines Single Berechnen
Dez. 7 = Bin. 111
Du solltest dort eine 8 verwenden. des weiteren versuch mal den Datentyp cardinal Anstelle von integer. |
Re: Bitmuster eines Single Berechnen [gelöst ]
Ja das Weis ich, und genau das will ich ja auch ;)
so gehts :
Delphi-Quellcode:
@ generic
Function BinFtoString(d: single): String;
Var i: integer; k: ^integer; j: integer absolute d; Begin result := ''; For i := 0 To 31 Do Begin If j And 1 = 1 Then result := '1' + result Else result := '0' + result; j := j Shr 1; End; End; thx mit 8 statt 7 gehts auch ;)
Delphi-Quellcode:
Function BinFtoString(d: single): String;
Var i, j: integer; k: ^integer; Begin result := ''; k := @d; j := k^; For i := 0 To 31 Do Begin If (j And $80000000 = $80000000) Then result := result + '1' Else result := result + '0'; j := j Shl 1; End; End; |
Re: Bitmuster eines Single Berechnen
Liste der Anhänge anzeigen (Anzahl: 1)
Statt Integer lieber LongInt oder LongWord verwenden (Single ist 4 Byte ... Integer ist es nicht unbedingt)
Delphi-Quellcode:
Function BinFtoString(f: Single): String;
Var i: Integer; b: LongInt absolute f; Begin SetLength(Result, 32); For i := 32 downto 1 do Begin Result[i] := Char((b and 1) + Ord('0')); b := b shr 1; End; End; Function BinFtoString(f: Single): String; Var i: Integer; b: PLongInt; Begin b := @f; SetLength(Result, 32); For i := 32 downto 1 do Begin Result[i] := Char((b^ and 1) + Ord('0')); b^ := b^ shr 1; End; End; |
Re: Bitmuster eines Single Berechnen
der Himitsu macht wieder die GAnz elegante Variante ;).
Du nutzt die Sprachspezifikation voll aus, auf solche Ideen würde ich ja erst gar nicht kommen. sieht auf jeden richtig cool aus der source . Aber wenn ich deinen Source sehe grad noch ne andere Frage : Wenn ich
Delphi-Quellcode:
Deklariere mache ich das ja weil ich eine Statische Variable haben will die dann immer Gleich groß ist.
var S:String[10];
Nur kann ich in meinem Projeckt dann nicht einfach auf s[5] zugreifen. Das Geht erst wenn ich vorher
Delphi-Quellcode:
gemacht habe. Weis Jemand was das dann soll ?
Setlength(s,10);
Klar zum Lesen/ Schreiben in Streams müste es noch was Bringen, aber wieso mus ich trotzdem noch das Setlength machen ? Wenn ich ein Statisches Array mache und ne Variable von dem Typ mache mus ich ja auch kein Setlength mehr mit angeben. |
Re: Bitmuster eines Single Berechnen
wegen weil der Null-Terminierung von Strings!
|
Re: Bitmuster eines Single Berechnen
String[10] gibt 'nen ShortString an, welcher maximal 10 Zeichen enthalten kann ... aber ein ShortString hat noch 'nen LängenByte und das steht anfangs auf 0 (keine Zeichen enthalten)
du kannst da entweder Array[0..9] of Char verwenden, oder mußt halt (z.B. per SetLength) die Länge noch definieren [add] ups: doch keine 0 am Anfang ... ein ShortString wird nicht initialisiert ... heißt, es kann da auch vollkommener Schrott drinstehn.
Delphi-Quellcode:
S = 'ab'
Var S: String[10];
S[0] := #2; // Index null entspricht der Position des Längenbytes // das entspricht also SetLength(S, 2); S[1] := 'a'; S[2] := 'b'; S[9] := 'x'; bei ShortString gibt es keine Terminierung mit #0 ... da zählt nur die Angabe im Längenbyte [add2] zum Testen:
Delphi-Quellcode:
im Labem steht nun 'ab#d' (# ist ein zufälliges Zeichen)
procedure TForm1.FormCreate(Sender: TObject);
Var S: String[10]; begin SetLength(S, 4); S[1] := 'a'; S[2] := 'b'; S[4] := 'd'; S[9] := 'x'; Label1.Caption := s; end; |
Re: Bitmuster eines Single Berechnen
Vielen Dank himitsu
das macht es etwas verständlicher. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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