Wie stelle ich eine Zahl in der Basis 2 ^ 32 dar?

7

Wenn ich eine Base 10 oder Base 16 Nummer habe, wie ändere ich sie in Base 2 ^ 32?

Der Grund, warum ich das versuche, ist die Implementierung von BigInt, wie von anderen Mitgliedern hier vorgeschlagen. Warum sollte eine höhere Basis für die Implementierung von BigInt verwendet werden?

Wird es gleich sein wie Integer (Basis 10) bis 2 ^ 32? Was wird danach passieren?

    
questions 16.04.2012, 19:29
quelle

5 Antworten

12

Sie versuchen etwas von der Form zu finden

%Vor%

Das ist genau die Definition eines Basis-2 32 Systems, also ignoriert all die Leute, die dir gesagt haben, dass deine Frage keinen Sinn ergibt!

>

Wie auch immer, was Sie beschreiben, ist bekannt als Basiskonvertierung . Es gibt schnelle Wege und es gibt einfache Wege, dies zu lösen. Die schnellen Wege sind sehr kompliziert (es gibt ganze Kapitel von Büchern gewidmet dem Thema, und ich werde nicht versuchen, sie hier anzusprechen (nicht zuletzt, weil ich nie versucht habe, sie zu benutzen) / p>

Ein einfacher Weg besteht darin, zuerst zwei Funktionen in Ihrem Zahlensystem zu implementieren, Multiplikation und Addition. (d. h. implementieren BigInt add(BigInt a, BigInt b) und BigInt mul(BigInt a, BigInt b) ). Sobald Sie das gelöst haben, werden Sie feststellen, dass eine Basis-10-Nummer wie folgt ausgedrückt werden kann:

%Vor%

was auch geschrieben werden kann als:

%Vor%

Wenn Sie also in Ihrer Eingabezeichenfolge von links nach rechts gehen, können Sie jeweils eine Ziffer aus der ersten zehn Ziffern entfernen und die Funktionen add und mul in Ihrer BigInt : %Vor%

Haftungsausschluss: Diese Methode ist nicht rechenintensiv, aber es wird Ihnen zumindest helfen.

Hinweis: Die Konvertierung von base-16 ist viel einfacher, weil 2 32 ein genaues Vielfaches von 16 ist bis hin zu verketten Bits.

    
Oliver Charlesworth 16.04.2012, 19:58
quelle
5

Nehmen wir an, wir sprechen über eine Basis-10-Nummer:

%Vor%

wobei jede a[i] eine Ziffer im Bereich von 0 bis einschließlich 9 ist.

Ich gehe davon aus, dass Sie die Zeichenfolge, die Ihr Eingabewert ist, analysieren und das Array a[] finden können. Sobald Sie dies getan haben und angenommen, dass Sie Ihre BigInt -Klasse bereits mit den Operatoren + und * implementiert haben, sind Sie zu Hause. Sie können den obigen Ausdruck einfach mit einer Instanz Ihrer BigInt -Klasse auswerten.

Sie können diesen Ausdruck relativ effizient mit Horners Methode bewerten.

Ich habe das nur von oben geschrieben, und ich wette, dass es viel effizientere Basis-Konvertierungsschemata gibt.

    
David Heffernan 16.04.2012 19:58
quelle
4
  

Wenn ich eine Base 10 oder Base 16 Nummer habe, wie ändere ich sie in Base 2 ^ 32?

Genau wie Sie es in eine andere Basis konvertieren. Sie möchten die Nummer n als

schreiben %Vor%

Finde also die größte Potenz von 2 ^ 32, die in n unterteilt ist, subtrahiere das Vielfache dieser Potenz von n und wiederhole die Differenz.

Sind Sie jedoch sicher, dass Sie die richtige Frage gestellt haben?

Ich vermute, dass Sie eine andere Frage stellen wollen. Ich vermute, dass Sie fragen wollen: Wie parse ich eine Basis-10-Nummer in eine Instanz meiner BigInteger ? Das ist einfach. Beschreiben Sie Ihre Implementierung und stellen Sie sicher, dass Sie + und * implementiert haben. Ich bin völlig agnostisch zu, wie Sie eigentlich ganze Zahlen darstellen, aber wenn Sie Base 2 ^ 32 verwenden wollen, gut, tun Sie es. Dann:

%Vor%

Ich überlasse es Ihnen, dies in C zu übersetzen.

    
jason 16.04.2012 19:43
quelle
1

Die Basis 16 ist einfach, da 2 32 16 8 ist, eine genaue Leistung. Also, ausgehend von der niedrigstwertigen Stelle, lese 8 Basis-16 Ziffern gleichzeitig, wandle diese Stellen in einen 32-Bit Wert um, und das ist die nächste Basis-2 32 "Ziffer".

Basis 10 ist schwieriger. Wie du sagst, wenn es weniger als 2 32 ist, dann nimmst du einfach den Wert als einzelne Base-2 32 "Ziffer". Ansonsten ist die einfachste Methode, an die ich denken kann, die Verwendung des Long Division-Algorithmus, um den Basis-10-Wert wiederholt durch 2 32 zu teilen; in jeder Stufe ist der Rest die nächste Basis-2 32 "Ziffer". Vielleicht könnte jemand, der mehr Zahlentheorie als ich kennt, eine bessere Lösung bieten.

    
Mike Seymour 16.04.2012 20:04
quelle
0

Ich denke, das ist völlig vernünftig.

Was Sie tun, ist eine sehr große Zahl (wie ein Verschlüsselungsschlüssel) in einem Array von 32-Bit-Ganzzahlen darzustellen.

Eine Darstellung der Basis 16 ist die Basis 2 ^ 4 oder eine Reihe von 4 Bits gleichzeitig. Wenn Sie einen Strom von 16 Zeichen "Basis" erhalten, füllen Sie die niedrigen 4 Bits der ersten Ganzzahl in Ihrem Array, dann die nächstniedrigste, bis Sie 8 "Ziffern" lesen. Gehe dann zum nächsten Element im Array.

%Vor%

Es gibt einige Korrekturen, wie zum Beispiel das Beenden von * plDst mit iPos und das Verfolgen der Anzahl der ganzen Zahlen in Ihrem Array.

Es gibt auch etwas Arbeit von Basis 10 zu konvertieren.

Aber das ist genug, um Sie zu beginnen.

    
Marlin Pierce 16.04.2012 20:20
quelle

Tags und Links