2010-02-09 3 views
5

Wie kann ich Doppelwert in Binärwert umwandeln.Doppelwert in Binärwert umwandeln

ich habe einen gewissen Wert, wie dies unter 125252525235558554452221545332224587265 möchte ich das i in binäre format..so konvertieren es in Doppel bin zu halten und dann in binäre zu konvertieren versuchen (1 & 0'en) .. Ich bin mit C# .net

+0

Sie müssen etwas genauer in Ihrer Frage sein. Details wie Programmiersprache, CPU, Betriebssystem usw. und etwas mehr über das, was Sie tatsächlich erreichen wollen, werden viel bessere Antworten liefern. http://catb.org/~esr/faqs/smart-questions.html –

Antwort

0

Wenn du meinst, du willst es selbst machen, dann ist das keine Programmierfrage.

Wenn Sie möchten, dass ein Computer es tut, ist der einfachste Weg, eine Fließkomma-Eingabe-Routine zu verwenden und dann das Ergebnis in seiner Hex-Form anzuzeigen. In C++:

double f = atof ("5.5555555555556E18"); 
unsigned char *b = (unsigned char *) &f; 
for (int j = 0; j < 8; ++j) 
    printf (" %02x", b [j]); 
+0

Sie möchten vielleicht erwähnen, dass die 8 für einen sehr spezifischen Datentyp ist. Ich glaube nicht, dass IEEE754 64-bit vom C-Standard vorgeschrieben ist. – paxdiablo

11

Nun, haben Sie eine Plattform nicht angegeben, oder welche Art von Binärwert Sie interessiert sind, aber in .NET gibt es BitConverter.DoubleToInt64Bits, die Sie an den IEEE 754 Bits erhalten lässt den Wert bilden sehr leicht.

In Java gibt es Double.doubleToLongBits, die das gleiche tut.

Beachten Sie, dass wenn Sie einen Wert wie "125252525235558554452221545332224587265" haben, dann haben Sie mehr Informationen als ein Doppel kann genau an erster Stelle speichern.

0

Ein doppelter Wert ist bereits ein binärer Wert. Es ist nur eine Frage der Repräsentation, die Sie wünschen. In einer Programmiersprache, wenn Sie es als Double bezeichnen, wird die Sprache, die Sie verwenden, auf eine Art interpretiert. Wenn Sie denselben Block des Speichers ein Int aufrufen, dann ist es nicht die gleiche Nummer.

Es kommt also darauf an, was Sie wirklich wollen ... Wenn Sie es auf Festplatte schreiben oder vernetzen müssen, dann müssen Sie über BigEndian/LittleEndian nachdenken.

+0

Ich habe einen Wert wie folgt unter 125252525235558554452221545332224587265 Ich möchte dies in Binärformat..so konvertieren ich bin es in Doppel und dann versuchen, auf Binär (1 & 0) zu konvertieren .. Ich verwende C# .net – raj

+0

BTW, diese Zahl ist 127 Bits lang, kann also nur mit einem Doppel (schlecht) angenähert werden. –

6

In C, können Sie es zum Beispiel auf diese Weise tun, die eine klassische Verwendung des union Konstrukt ist:

int i; 
union { 
double x; 
unsigned char byte[sizeof (double)]; 
} converter; 

converter.x = 5.5555555555556e18; 

for(i = 0; i < sizeof converter.byte; i++) 
    printf("%02x", converter.byte[i]); 

Wenn Sie dies in einem main() und führen Sie es halten, könnte es so etwas wie dieses drucken :

~/src> gcc -o floatbits floatbits.c 
~/src> ./floatbits 
ba b5 f6 15 53 46 d3 43 

Beachten Sie, dass dies aber natürlich ist plattformabhängig in seiner endianness. Das obige stammt von einem Linux-System, das auf einer Sempron-CPU läuft, d.h. es ist Little Endian.

-1

Für diese riesigen Zahlen (die nicht korrekt mit einem Doppel dargestellt werden können) müssen Sie eine spezielle Klasse verwenden, um die benötigten Informationen zu halten.

C# stellt die Dezimal-Klasse:

der Dezimalwert Typ im Bereich von Dezimalzahlen positiven 79.228.162.514.264.337.593.543.950.335 negativen 79.228.162.514.264.337.593.543.950.335 darstellt. Der Decimal-Werttyp ist für Finanzberechnungen geeignet, die eine große Anzahl von signifikanten Integral- und Nachkommastellen und keine Rundungsfehler erfordern. Der Dezimaltyp beseitigt nicht die Notwendigkeit zum Runden. Es minimiert vielmehr Fehler aufgrund von Rundungen. Beispielsweise erzeugt der folgende Code ein Ergebnis von ,9999999999999999999999999999 statt 1.

Wenn Sie größere Präzision benötigen als diese, müssen Sie Ihre eigene Klasse Ich denke, machen.Es gibt hier einen für ints: http://sourceforge.net/projects/cpp-bigint/ obwohl es für C++ zu sein scheint.