Heim  >  Artikel  >  Backend-Entwicklung  >  Interviewfrage: Erläuterung der Implementierungsidee der Umkehrung binärer Bits (allgemeine PHP-Version)

Interviewfrage: Erläuterung der Implementierungsidee der Umkehrung binärer Bits (allgemeine PHP-Version)

angryTom
angryTomnach vorne
2019-10-15 10:18:554834Durchsuche

Dies ist eine Interviewfrage, und einige Studenten äußerten, dass sie sie nicht verstehen könnten. Es ist nicht schwierig, Ihnen eine einfache Schulung zu geben, aber das Verfassen eines perfekten Vergleichs erfordert auch ein gewisses Maß an logischem Denkvermögen. Da die Richtung der Schüler PHP ist, werde ich sie gleichzeitig mit PHP erklären Gleichzeitig sagt es auch jedem, dass das Erlernen von PHP nicht funktioniert. Es wird gesagt, dass man PHP aufrufen kann, solange man zwei Echo-Sätze „Hallo Welt“ schreiben oder eine Schleife auf eine Webseite ausgeben kann.

Es gibt einige zu ergänzende Kenntnisse: (Empfohlenes Lernen: PHP-Video-Tutorial)

1 , Eine Zahl belegt ein Byte, d Vergessen Sie, dass Sie Folgendes nicht verstehen können~~~)

Sie können in PHP

echo bindec("00000001");   //bindec函数可以让你体会到 二进制和10进制之间的 骚转换<br/>

2 verwenden. (Dieser Tipp ist sehr wichtig ~~ , verstehe es sorgfältig)

Verwenden Sie Binär, um es mit Verschiebung zu machen

Antwort

: 00000010 Das ist genau 2 (2 hoch 1)

Was ist mit der Dezimalzahl 2+1=3?


Antwort

: 00000011 Das ist genau 3 (2 hoch 1. Potenz + 2 hoch 0. Potenz = 2+1=3)

Was ist mit der Dezimalzahl 3+1=4?


Antwort

: 00000100 Das ist 4 (2 hoch 2)

Was ist also mit der Dezimalzahl 4+1=5?


Antwort

: 00000101 Das ist 4 (2 hoch 2 + 2 hoch 0 = 4 + 1 = 5)


Beginnen Sie mit der Lösung des Problems

Angenommen, es gibt eine Binärzahl 00000101. Jetzt müssen wir sie auf den Kopf stellen und in 10100000 ändern. Wie wird gespielt?

Die Antworten finden sich überall im Internet, daher hier die Idee:


1. Zuerst muss es zwei Variablen geben,

1 ) Die temporäre Variable heißt $xxoo und der Anfangswert ist 0 (dezimal), was binär 00000000

ist. 2) Die ursprüngliche Wertvariable heißt $shit, was 00000101

2. 3 Schritte

1) Verschiebe $xxoo um eine Position nach links 2) Bestimmen Sie, ob die letzte Ziffer des Binärwerts von $shit ist 1. Wenn ja, geben Sie $ an. Der Dezimalwert von xxoo wird um 1 erhöht. Es ist sehr wichtig, ihn als binär zu betrachten und 00000000 in 00000001 zu ändern. Andernfalls ist der Anfangswert von $xxoo 00000000. Dies wird um p verschoben. . . Sie sind alle Null. Wie kann man also feststellen, ob das letzte Bit der Binärzahl 1 ist? Sie müssen anhand des Abfangens von Zeichenfolgen oder regulären Ausdrücken urteilen (das ist nicht unmöglich)

Antwort

: Führen Sie einfach eine logische UND-Verknüpfung mit dem ursprünglichen Wert und 1 (d. h. 00000001) durch (1&1 ist 1, 1&0 oder 0&1 sind immer 0)

3) Als nächstes verschieben Sie $shit um 1 Position nach rechts

1) Wenn es ursprünglich 00000101 war, wird es 00000010 nach dem Verschieben ( Das heißt, $xxoo und shit werden gleichzeitig verschoben, eines nach links und eines nach rechts. Wenn das letzte Bit shit 1 ist, können wir es beurteilen, also das letzte Bit von $xxoo ist ebenfalls auf 1 gesetzt, sodass sowohl xxoo als auch shit realisiert werden können. Die Synchronisierung wird umgekehrt) Wiederholen Sie den obigen Vorgang 8 Mal, um 10100000 zu erhalten

Der vollständige Code ist wie folgt

function rev($n)<br/>{<br/>    $xxoo = 0;<br/>    for ($i = 0; $i < 8; $i++) {<br/>        $xxoo = $xxoo << 1;<br/>        if (($n & 1) == 1) {<br/>            $xxoo++;<br/>        }<br/>        $n = $n >> 1;<br/>    }<br/>    return $xxoo;<br/>}<br/>echo decbin(rev(5));<br/>

Aber seien Sie vorsichtig. Die Sache ist, dass die obige Funktion 1-Byte-Zahlen unterstützt (unterstützt nur 8 Ziffern)

Die Online-Interviewfragen sind 32-Bit-Zahlen, und der folgende Code unterstützt universelle Ziffern (Dieser Code ist online nicht verfügbar~~~). Lassen Sie uns darüber nachdenken und es verstehen, damit ich nicht zu viel erklären muss:

function rev($n)<br/>{<br/>    $num=intval(strlen(decbin($n))/8); //整除 8<br/>    if($num==0)<br/>        $bitLen=8;//最小8位<br/>    else<br/>    {<br/>        if((strlen(decbin($n)) % 8)>0)<br/>            $bitLen=($num+1)*8;<br/>        else<br/>            $bitLen=$num*8;<br/>    }<br/>    echo “原始值二进制:”.str_pad(decbin($n),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/>    $xxoo = 0;<br/>    for ($i = 0; $i < $bitLen; $i++) {<br/>        $xxoo = $xxoo << 1;<br/>        if (($n & 1) == 1) {<br/>            $xxoo++;<br/>        }<br/>        $n = $n >> 1;<br/>    }<br/>    echo “反转后值二进制:”.str_pad(decbin($xxoo),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/>    return $xxoo;<br/>}<br/>

echo rev(4);<br/>echo rev(43261596);<br/>

Test aufrufen

原始值二进制:00000100<br/>反转后值二进制:00100000<br/>32原始值二进制:00000010100101000001111010011100<br/>反转后值二进制:00111001011110000010100101000000<br/>964176192<br/>

Ergebnis

rrreee

Das obige ist der detaillierte Inhalt vonInterviewfrage: Erläuterung der Implementierungsidee der Umkehrung binärer Bits (allgemeine PHP-Version). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:www.hishenyi.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen