PHP - Wie base_convert () bis zur Basis 62

7

Ich brauche eine base_convert() -Funktion, die von der Basis 2 bis zur Basis 62 funktioniert, aber mir fehlt die Mathematik, die ich verwenden muss. Ich weiß, dass ich aufgrund der Einschränkungen von PHP bcmath verwenden muss gut.

Funktionen wie diese konvertieren eine Zahl zu und von Base 10 zu einer anderen Base bis zu 62 , aber ich möchte die gleiche Funktionalität von base_convert() implementieren, zB: eine einzige Funktion, die zwischen beliebigen Basen konvertieren kann.

Ich habe eine Funktion gefunden, die dies zu tun scheint , aber es gibt Ich habe das Gefühl, einen überflüssigen und langsamen Code zu haben, und ich würde es gerne ein wenig verbessern, wenn ich Deutsch würde, was ich nicht weiß. = (

Hier ist eine besser lesbare Version der Funktion:

%Vor%

Kann mir jemand die obige Funktion erklären oder mir etwas Licht auf den Prozess der direkten Umwandlung zwischen beliebigen Basen geben?

    
Alix Axel 21.12.2009, 03:34
quelle

6 Antworten

12

Ab PHP 5.3.2 unterstützen bc_math und gmp jetzt Basen bis zu 62, also können Sie einfach Folgendes tun:

%Vor%

oder das bc_math-Äquivalent.

    
Synchro 10.08.2011, 16:17
quelle
8

Bitte fragt mich nicht, wo ich es herbekommen habe, ich erinnere mich nur daran, dass es auf einigen Beispielen basiert, die ich im Internet gefunden habe ...

%Vor%     
Florian Fida 12.01.2011 12:10
quelle
1

Der einfachste Ansatz für Übersetzungsprobleme, von der numerischen Basis bis zur menschlichen Sprache, ist die Übersetzung über ein Zwischenformat.

%Vor%

Jetzt brauchen Sie nur noch bc_convert_to und bc_parse_num zu schreiben. Wenn die Plattform numerische Typen unterscheidet, müssen Sie dies berücksichtigen. Auch Gleitkommazahlen erfordern eine spezielle Überlegung, da eine Zahl eine endliche Darstellung in einer Basis haben kann, aber nicht in einer anderen (z. B. 1/3 ist 0,1 3, aber 0,333 ... 10 10 / >, und 1/10 10 ist .0001100110011 ... 2 ).

Wie für eine allgemeine Erklärung, wie die Konvertierung funktioniert, sollten Sie sich überlegen, wie positionelle Basissysteme funktionieren. Eine Zahl der Form "a n a n-1 ... a 1 a <0> in a Basis b repräsentiert die Zahl "a n -1 + ... + a 1 * b 1 + a 0 0 ". Konversion funktioniert im Grunde genommen durch Auswertung des Ausdrucks im Kontext einer anderen Base β.

    
outis 21.12.2009 03:42
quelle
1

Die meisten Beispiele, die ich im Internet gefunden habe und in diesen Antworten verwenden BC Math-Funktionen. Wenn Sie BC Math-Funktionen nicht verwenden möchten, können Sie sich diese Bibliothek ansehen: Ссылка

  • Es verwendet keine BC-Math-Funktionen, so dass es ohne die Verwendung von BC Math funktioniert Bibliothek.
  • Es verwendet die systemeigenen base_convert-Funktionen, wenn die Basis für eine schnellere Ausführung unter 36 liegt.
  • Die Ausgabenummer ist abwärtskompatibel mit der nativen Funktion base_convert.
  • Kann verwendet werden, um in und zwischen beliebigen Basen zwischen 2-64 zu konvertieren.
Lalit 08.12.2011 11:49
quelle
0

Ich schrieb über die Verwendung der BCMath-Funktionen für die Dezimal / Binär-Konvertierung hier: Ссылка . Sie können diesen Code leicht ändern, um ihn in verschiedene Basen zu konvertieren.

Wenn Sie beispielsweise ganze Zahlen konvertieren, ändern Sie die Routinen dec2bin_i () und bin2dec_i (). Benennen Sie sie um und fügen Sie einen Basisparameter hinzu - etwa dec2base_i ($ base, $ dezimal_i) und base2dec_i ($ base, $ num_i), ändern Sie die festcodierte '2' in die Variable $ base, konvertieren Sie die numerischen Reste in / aus Zeichen von die Basis und benenne die Variablen um.

Um nun zwischen beliebigen Basen zu konvertieren, verwenden Sie dezimal als Zwischenprodukt und rufen Sie diese beiden neuen Funktionen auf. Konvertieren Sie zum Beispiel Base 42 Nummer "123" in Base 59 indem Sie $ dec = base2dec_i ('42 ',' 123 ') gefolgt von $ b59 = dec2base_i (59, $ dez) aufrufen.

(Sie können auch eine kombinierte Funktion erstellen, die dies in einem Aufruf erledigt.)

    
Rick Regan 21.12.2009 14:29
quelle
-1

Diese Funktion gibt dasselbe aus als GNU Multiple Precision wenn möglich ...

%Vor%     
Php'Regex 08.03.2017 20:33
quelle

Tags und Links