BigInteger in Hex/Dezimal/Oktal/Binär-strings?
In Java, die ich tun könnte
BigInteger b = new BigInteger(500);
Dann formatieren, wie ich es gerne
b.toString(2); //binary
b.toString(8); //octal
b.toString(10); //decimal
b.toString(16); //hexadecimal
In C#, ich kann
int num = int.Parse(b.ToString());
Convert.ToString(num,2) //binary
Convert.ToString(num,8) //octal
etc.
Aber ich kann nur mit long
Werte und kleiner. Gibt es eine Methode zum drucken ein BigInteger mit einer angegebenen Basis? Ich habe dies geschrieben, BigInteger Analysieren Oktal-String?, gestern und erhielt die Lösung der Frage, wie konvertiert grundsätzlich alle Texte in BigInteger-Werte, aber hatte noch nicht den Erfolg ausgeben.
msdn.microsoft.com/en-us/library/dd268260.aspx
Sie sagen, wie es in hex und sonst nichts. Ich habe das Dokument ein paar mal in der Hoffnung das ich etwas verpasst, aber NÖ...
Nein, Sie sind richtig. Lächerlich. Frag mich nicht warum, Microsoft macht alles so schmerzhaft. Ihre .NET BigInteger-Klasse sollte mindestens so funktional wie die Java-Klasse BigInteger bedenkt, dass es erstellt wurde, 15 Jahren oder später mehr als Java.
Sie sagen, wie es in hex und sonst nichts. Ich habe das Dokument ein paar mal in der Hoffnung das ich etwas verpasst, aber NÖ...
Nein, Sie sind richtig. Lächerlich. Frag mich nicht warum, Microsoft macht alles so schmerzhaft. Ihre .NET BigInteger-Klasse sollte mindestens so funktional wie die Java-Klasse BigInteger bedenkt, dass es erstellt wurde, 15 Jahren oder später mehr als Java.
InformationsquelleAutor snotyak | 2012-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konvertieren
BigInteger
- zu-dezimal -, hex -, Binär -, oktal-string:Beginnen wir mit einem
BigInteger
Wert:Basis 10 und Basis 16
Die integrierte Basis 10 (dezimal) und Basis 16 (hexadezimal) coversions sind einfach:
Führenden Nullen (positive vs. negative BigInteger-Werte)
Beachten Sie, dass
ToString("X")
sorgt hexadezimale Zeichenfolgen haben eine führende null, wenn der Wert desBigInteger
ist positiv. Dies ist im Gegensatz zu dem üblichen Verhalten vonToString("X")
bei der Umwandlung von anderen Wert-Typen, wobei führende Nullen unterdrückt werden.BEISPIEL:
ERGEBNIS:
Es ist ein Zweck für dieses Verhalten als eine führende null zeigt an der
BigInteger
ist ein positiver Wert--im wesentlichen, die führende null liefert das Zeichen. Dies ist erforderlich (im Gegensatz zu anderen Wert-Typ-Konvertierungen), weil einBigInteger
hat keine Feste Größe; daher gibt es keine ausgewiesenen Vorzeichen-bit. Die führende null kennzeichnet einen positiven Wert, im Gegensatz zu einer negativen. Dies ermöglicht eine "round-tripping"BigInteger
Werte durchToString()
und zurück durchParse()
. Dieses Verhalten wird diskutiert über die BigInteger-Struktur - Seite auf MSDN.Extension Methoden: BigInteger, Binär, Hex, Oktal
Hier ist eine Klasse mit extension-Methoden zum konvertieren von
BigInteger
Instanzen zu Binär -, hexadezimal-und oktal-strings:Auf den ersten Blick, die diese Methoden scheinen komplexer als notwendig. Ein bisschen zusätzliche Komplexität ist, in der Tat, Hinzugefügt, um sicherzustellen, dass die entsprechenden führenden Nullen vorhanden sind, in die konvertiert strings.
Betrachten wir jeden Erweiterung Methode um zu sehen, wie Sie arbeiten:
BigInteger.ToBinaryString()
Hier ist, wie diese Erweiterung Methode zum konvertieren von
BigInteger
in einen Binär-string:Den wesentlichen Kern jedes dieser Erweiterung Methoden ist die
BigInteger.ToByteArray()
Methode. Diese Methode wandelt eineBigInteger
ein byte-array, das, wie wir bekommen können die binäre Darstellung einesBigInteger
Wert:Beachten Sie aber, das zurückgegebene ByteArray im little-endian-Reihenfolge, so dass das erste array-element ist das least significant byte (LSB) des
BigInteger
. Seit einStringBuilder
wird genutzt, um den Ausgabe-string--beginnt bei den meisten-signifikante Ziffer (MSB)--das byte-array müssen Durchlaufen werden in umgekehrter so, dass das most significant byte ist erst konvertiert.So, ein index-Zeiger gesetzt ist, zu der die meisten signifikanten Stelle (das Letzte element) in das byte-array:
Zur Erfassung der umgewandelten bytes, ein
StringBuilder
erstellt:Den
StringBuilder
Konstruktor nimmt die Kapazität für dieStringBuilder
. Die Kapazität für dieStringBuilder
wird berechnet, indem die Anzahl von bytes zu konvertieren, multipliziert mit acht (acht binären Ziffern, die das Ergebnis von jedem byte konvertiert).Das erste byte wird dann in einen Binär-string:
Zu diesem Zeitpunkt ist es notwendig, um sicherzustellen, dass eine führende null existiert, wenn die
BigInteger
ist ein positiver Wert (siehe Diskussion oben). Wenn die erste umgebaute Ziffer ist keine null, undbigint
positiv ist, dann eine'0'
an dieStringBuilder
:Nächsten, die konvertiert byte angehängt, um die
StringBuilder
:Konvertieren Sie die verbleibenden bytes, die eine Schleife durchläuft den Rest des byte-Arrays in umgekehrter Reihenfolge:
Beachten Sie, dass jedes konvertiert byte aufgefüllt wird Links mit Nullen ('0'), als notwendig, so dass die konvertierte Zeichenfolge ist acht binären Zeichen. Dies ist äußerst wichtig. Ohne diese Polsterung, die den hexadezimalen Wert '101' konvertiert einen binären Wert '11'. Die führenden Nullen sicherzustellen, dass die Konvertierung '100000001'.
Wenn alle bytes werden umgewandelt, die
StringBuilder
enthält die vollständige Binär-string, der zurückgegeben wird, durch den extension-Methode:BigInteger.ToOctalString
Umwandlung einer
BigInteger
um eine oktale (Basis 8) der string ist komplizierter. Das problem ist, oktal-Zahl werden die drei bits, die nicht einem vielfachen von acht bits hielt in jedem element des byte-Arrays erstellt vonBigInteger.ToByteArray()
. Um dieses problem zu lösen, drei bytes aus dem array kombiniert werden, in Stücken von 24-bit. Jeder 24-bit-chunk gleichmäßig konvertiert zu acht oktal-Zeichen.Den ersten 24-bit-chunk erfordert einige modulo-Mathe:
Dieser Berechnung wird bestimmt, wie viele bytes sind "extra", wenn die gesamte byte-array ist aufgeteilt in drei byte (24-bit) zu realisieren. Die erste Umwandlung in eine Oktalzahl (das am meisten signifikante Ziffern) erhält die "extra" - bytes, so dass alle restlichen Umbauten werden drei bytes jeder.
Wenn es keine "extra" - Byte, dann das erste Stück bekommt eine volle drei bytes:
Den ersten chunk geladen wird in eine integer-variable namens
int24
hält bis zu 24-bit. Jedes byte der chunk geladen ist. Als zusätzliche bytes, die geladen werden, werden die vorherigen bit inint24
Links verschoben um 8 bits, um Platz zu machen:Konvertierung eines 24-bit-chunk oktal erfolgt durch:
Wieder, die erste Ziffer muss eine führende null, wenn der
BigInteger
ist ein positiver Wert:Die erste umgebaute Stück ist angehängt an die
StringBuilder
:Den verbleibenden 24-bit-Blöcken umgewandelt werden in eine Schleife:
Wie die binäre Konvertierung, jede konvertierte oktal-string von Links mit Nullen aufgefüllt, so dass die '7' wird '00000007'. Dieser sorgt dafür, dass die Nullen nicht gelöscht werden aus der Mitte des umgewandelten strings (d.h., '17', statt '100000007').
Umstellung auf Base x?
Umwandlung einer
BigInteger
zu anderen Zahlensystemen könnte viel komplizierter. Solange die Anzahl Basis ist eine Potenz von zwei ist (D. H., 2, 4, 8, 16) das byte-array erstellt durchBigInteger.ToByteArray()
angemessen aufgeteilt in Blöcken von bits und umgesetzt.Jedoch, wenn die Zahl, die Basis ist nicht eine Potenz von zwei ist, wird das problem viel komplizierter und erfordert viel looping und division. Als solcher Zahl, base-conversions sind selten, ich habe nur die gängigen computing-Anzahl Basen hier.
"Beachten Sie, dass ToString("X") sorgt dafür, hexadezimale Zeichenfolgen haben eine führende null, wenn der Wert des BigInteger ist positiv.". dies ist (jetzt) falsch. Beispiel: BigInteger.Parse("93528675864").ToString("X") liefert "15C6BE5618".
Ich bin nicht davon überzeugt. Die Dokumentation für die aktuelle version noch das Verhalten beschreibt. Sie erstellt haben, kann eine negative Zahl, ich bin mir nicht sicher. Versuchen Sie, das Beispiel mit 128 oder -128, wie gezeigt, in meinem schreiben-uo.
ich begreifen. ich habe die Dokumentation gelesen und ich habe versucht, diese mit 128, -128 und mehrere andere zahlen. manchmal klappt es, manchmal nicht. ich will nicht sagen, deine Aussage ist völlig falsch, nur scheinbar in einigen (unbekannten) Fällen. versuchen Sie kompilieren das Beispiel mit 93528675864. wenn ich eine Zeit habe werde ich untersuchen dieses genauer.
Vielleicht, weil 9 startet mit einem 1 bit? Versuchen Sie es mit etwas weniger als 8 für die erste Ziffer. Was solls, versuchen Sie, eine führende null, während Sie gerade dabei sind. Lesen Sie die Dokumentation auf den überlasteten Parse-Methoden. Es gibt einige Sachen, die in den Kommentaren darüber, wie negative zahlen behandelt werden. Ich Schätze, wenn Sie auf den Grund. Ich bin sehr überfordert mit den Verpflichtungen, die wahrscheinlich nicht in Sie Graben. Gute Arbeit.
InformationsquelleAutor Kevin P. Rice
Nach einem guten langen Tag der Arbeit mit BigInteger, ich habe einen besseren Weg, Dinge zu tun, um die Ausgabe der Zeichenkette im binären, versuchen Sie dies! (funktioniert nicht für negative zahlen)
InformationsquelleAutor Ghasan
Dies ist eine einfache Methode zum konvertieren von
BigInteger
zu jeder base:Es funktioniert perfekt für base 2-10. Wenn Sie möchten, es zu produzieren, hexadezimal-oder andere höhere Basis-Zeichenfolgen, die Sie ändern müssen, um
a % b
's form nach der Basis, bevor Sie es.BigInteger a
parameter werden solltethis BigInteger a
so kann es verwendet werden, direkt auf eine Instanz. Auch für große zahlenDivRem
(msdn.microsoft.com/en-us/library/...) könnte einen nennenswerten performance-Gewinn.In der Tat sehr einfach, aber, dass einige ziemlich intensive Mathe ist unnötig für 2^n die Anzahl der Basen. Wenn die Geschwindigkeit ist ein Anliegen, ich glaube nicht, es wäre günstig im Vergleich. Es auch funktioniert nicht für negative zahlen.
InformationsquelleAutor gkovacs90