In PHP ist der Umgang mit Konvertierungen zwischen verschiedenen Ziffern eine häufige Aufgabe. Die Funktion BindEc () ist eine von PHP nativ bereitgestellte Funktion und wird spezifisch zum Konvertieren verwendet. Dieser Artikel wird eine eingehende Analyse des Implementierungsmechanismus von Binec () , der Transformationslogik und seiner Beziehung zu Ganzzahltypen (INTs) in PHP durchführen.
Binec () nimmt eine binäre Zeichenfolge als Argument und gibt seine entsprechende Dezimalbezahlung zurück. Zum Beispiel:
echo bindec("1010"); // Ausgabe 10
Dieses Beispiel ist einfach und intuitiv und interpretiert binäre 1010 als Dezimalzahl 10 .
Es ist zu beachten, dass Binec () eher Zeichenfolgen als Zahlen empfängt. Auch wenn sich die Eingabe in einer rein numerischen Form befindet, muss es sich um eine Zeichenfolge handeln:
bindec("1101"); // richtig
bindec(1101); // Nicht empfohlen,Kann Verwirrung verursachen
Binec () führt die Umwandlung im Wesentlichen durch, indem jedes Bit in einer Zeichenfolge als 0 oder 1 behandelt und die Bitgewichte (2^n) von rechts nach links summiert werden.
Nehmen Sie Binec ("1101") als Beispiel:
1*(2^3) + 1*(2^2) + 0*(2^1) + 1*(2^0)
= 8 + 4 + 0 + 1
= 13
Diese Verarbeitungslogik stimmt sehr mit dem Standard -Binär- bis Dezimalalgorithmus überein. PHP wird intern über C -Sprache implementiert, was äußerst effizient ist.
Ganzzahltypen in PHP sind die obere Grenze (je nach Plattform). Binec () ist jedoch nicht auf diesen Bereich beschränkt. Wenn eine binäre Zeichenfolge den Maximalwert von PHP int überschreitet, ist der zurückgegebene Wert des Typs Float ein Float .
Beispiel:
echo bindec("1111111111111111111111111111111111111111111111111111111111111111");
// Ausgabe 18446744073709551615(64 indival 1)
Auf 64-Bit-Plattformen kann dieses Ergebnis weiterhin als Ganzzahl zurückgegeben werden. Auf einer 32-Bit-Plattform wird das Ergebnis zu einer schwimmenden Punktzahl.
Wenn die maximale Genauigkeit der schwimmenden Punkte überschritten wird, wird das Ergebnis außerdem ungenau. Daher sollten BCMATH- oder GMP-Erweiterungen in Betracht gezogen werden, wenn sie mit ultraigen binären Saiten zu tun haben.
Viele Entwickler verwenden Binec () und DecBin () in Kombination, um eine Roundtrip-Umwandlung zwischen den Partitionen zu bilden:
$dec = bindec("100101");
$bin = decbin($dec);
echo $bin; // Ausgabe 100101
Diese Interoperabilität ist völlig zuverlässig, aber nur, wenn die Eingabe -Binärzeichenfolge der Formatspezifikation entspricht und keine anderen Zeichen als 0 und 1 enthalten kann.
Binec () ignoriert das Teil nach nicht-binären Zeichen. Zum Beispiel:
echo bindec("11012"); // Ausgabe 13,"2" Ignoriert
Dies zeigt, dass Binec () von PHP "tolerant" ist, aber nicht streng. Daher wird empfohlen, die Eingangsprüfung vor dem Anruf durchzuführen:
function is_valid_binary($str) {
return preg_match('/^[01]+$/', $str);
}
Die Verwendung dieser Überprüfung kann potenzielle logische Fehler vermeiden.
Obwohl BindEc () eine Ganzzahl zurückgibt (oder bei einer großen Ganzzahl) ist, ist der Eingang immer eine Zeichenfolge. Dies spiegelt die impliziten Konvertierungen wider, die vom dynamischen Typ -System von PHP unten hergestellt wurden. PHP erzwingt keine Deklarationen vom Typ, aber wenn Sie eine Schnittstelle entwerfen, sollten Sie die erwarteten Typen explizit entwerfen, um die Laufzeitfehler zu reduzieren.
Wenn beispielsweise eine Funktion auf das Ergebnis der Ausgabe von Binec () für die Array -Indexierung oder Bitoperationen beruht, ist die Überprüfung von Zwangstypen besonders wichtig.
Ein allgemeiner Anwendungsfall ist ein Berechtigungssystem, das Binary zur Darstellung mehrerer Berechtigungsflags verwendet. Zum Beispiel:
$binaryPermission = "1011"; // 代表四indivalBerechtigungen:1.1、1.2和1.4indival启用
$permissions = bindec($binaryPermission);
// 检查1.3Ist das Bit das1(Zählen Sie von rechts nach links)
if ($permissions & (1 << 2)) {
echo "Berechtigungen3Ermöglicht";
}
In dieser Situation kann Binec () die Berechtigungsflag -Zeichenfolge effizient in eine Ganzzahlbitmaske umwandeln und den Status schnell mit Bitoperationen bestimmen.