AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konversion von dezimal zu binär

Ein Thema von diavy · begonnen am 31. Mai 2012 · letzter Beitrag vom 2. Jun 2012
Antwort Antwort
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Konversion von dezimal zu binär

  Alt 1. Jun 2012, 02:29
Das ist aber kein fair play: Du machst Dir die Tatsache zunutze, dass die Dezimalzahl intern ohnehin schon als Binärzahl konvertiert vorliegt. Du konvertierst nicht die Dezimalzahl in eine Binärzahl, sondern liest die bereits vorhandenen Bits der Binärdarstellung aus. Ich glaube nicht, dass das im Sinne des Aufgabenstellers ist.

Trotzdem geht es natürlich auch ohne die Power Funktion, man muss dazu nur die Zahl wiederholt durch zwei dividieren und die aufeinanderfolgenden Divisionsreste zu einem Binärzahlenstring zusammenhängen.
Das ist aber eine merkwürdige Argumentation.
Alle Daten ob Strings, Integers, oder Extended-Werte sind letztendlich binäre Daten.
Wenn jemand sein Wissen darüber nutzt, um zu einer Lösung zu kommen, dann ist das nicht unfair sondern vernünftig.

Der TE hatte ja seine "number" als Extended deklariert.

Die unten stehende Funktion nutzt die binäre Darstellung im Extended-Wert um ohne weitere Umwege den Extended in einen Binärstring umzuwandeln.
Sie ist für Werte von 0 bis 2^64-1 ausgelegt.
Bei Werten außerhalb dieses Bereiches wird eine Exception ausgelöst.

Ich hab die Funktion "auf die schnelle" geschrieben und nicht wirklich voll ausgetestet. Bitte keine Schimpfe wenn da Bugs drin sind.
Delphi-Quellcode:
FUNCTION ExtendedToBin(const v:extended):string;
type
   TExt=packed record M:UInt64; E:word; end;
const
   Bias=$3FFF; Sign=$8000; MaxE=Bias+63;
   sErr='Fehler bei Umwandlung in Binärstring.';
var
   e:word; i:integer;
begin
   e:=TExt(v).E;
   if e>0 then begin
      if (e>=Sign) or (e<Bias) or (e>MaxE) then raise Exception.Create(sErr);
      dec(e,Bias);
      if (e<63) and (((UInt64(1) shl (63-e) - 1) and TExt(v).M)<>0) then
         raise Exception.Create(sErr);
   end;
   SetLength(result,e+1);
   for i:=1 to e+1 do
      result[i]:=Chr($30 or Ord(TExt(v).m and (UInt64(1) shl (64-i))<>0));
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....

Geändert von Amateurprofi ( 1. Jun 2012 um 04:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 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 by Thomas Breitkreuz