Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion darüber, wie man Bitoperationen verwendet, um Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen in PHP zu implementieren

Eine kurze Diskussion darüber, wie man Bitoperationen verwendet, um Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen in PHP zu implementieren

青灯夜游
青灯夜游nach vorne
2021-07-08 18:45:323092Durchsuche

Wie verwendet PHP Bitoperationen, um vier arithmetische Operationen zu implementieren? In diesem Artikel erfahren Sie, wie Sie Bitoperationen verwenden, um die vier arithmetischen Operationen (Addition, Subtraktion, Multiplikation und Division) in PHP zu implementieren.

Eine kurze Diskussion darüber, wie man Bitoperationen verwendet, um Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen in PHP zu implementieren

Die grundlegendste Betriebseinheit eines Computers ist ein Byte. Ein Byte besteht aus 8 Bits und ein Bit kann nur eine 0 oder 1 speichern. Alle Daten im Computer werden binär gespeichert und verarbeitet, d. h. in der Kodierung von 1 und 0.

Dieses Mal versuche ich, vier arithmetische Operationen in PHP zu implementieren. Zuerst stelle ich einige grundlegende Konzepte vor:

Originalcode: Verwenden Sie das höchste Bit als Vorzeichenbit (0 bedeutet positiv, 1 bedeutet negativ) und andere digitale Bits stellen den absoluten Wert des Werts selbst dar. Wert

Einerkomplement: Das Einerkomplement einer positiven Zahl ist dasselbe wie der ursprüngliche Code, das Vorzeichenbit bleibt unverändert und die anderen Bits sind invertiert

Einerkomplement: Das Einserkomplement einer positiven Zahl ist das gleiche wie der Originalcode;

⒈ Addition

Es gibt nur 0 und 1 im Binärformat. Weder 0 + 0 noch 0 + 1 erfordern einen Übertrag, 1 + 1 jedoch. Verwenden Sie daher zunächst die Operation oder , um das Ergebnis der Addition der Bits zu erhalten, die keinen Übertrag erfordern. Führen Sie dann die Operationen von

und

aus, und wenn die beiden hinzugefügten Bits beide 1 sind, ist das Ergebnis 1. Wenn das Ergebnis der UND-Operation größer als 0 ist, bedeutet dies, dass ein Übertrag erforderlich ist. Zu diesem Zeitpunkt wird das Ergebnis der UND-Operation um 1 Bit nach links verschoben Die Verschiebung wird mit dem Ergebnis der ODER-Operation kombiniert und der obige Operationsprozess wird wiederholt, bis das Ergebnis der UND-Operation lautet. Das Ergebnis ist 0.

<?php

    function add($summand, $addend)
    {
        $sum = $summand ^ $addend;
        //  判断进位
        $carry = $summand & $addend;

        while ($carry <<= 1) {
            $summand = $sum;
            $addend = $carry;

            $sum = $summand ^ $addend;
            $carry = $summand & $addend;
        }

        return $sum;
    }
⒉ Subtraktion

Subtraktion kann man sich als Addition mit einem negativen Subtrahierer vorstellen, zum Beispiel kann man sich 2 - 1 als 2 + (-1) vorstellen.

<?php
    require &#39;addition.php&#39;;

    function subtract($minuend, $subtrahend)
    {
        //  先求得减数的补码,然后求和
        $subtrahend = add(~$subtrahend, 1);

        return add($minuend, $subtrahend);
    }

⒊ Multiplikation

Multiplikation kann auch als Variante der Addition betrachtet werden, beispielsweise kann m * n als Ergebnis der Addition von n m betrachtet werden. Es gibt jedoch eine schnellere Möglichkeit, die Multiplikation mithilfe von Bitoperationen zu implementieren. Beispiel: 3 * 10: Die binäre Darstellung von 3 ist 0011 und die binäre Darstellung von 10 ist 1010

​​​​​ 0 0 1 1

×​ 1 0 1 0

————— ———————

​​ 0 0 0

      0 0 1 1 0

  0 0 0 0 0 0

0 0 1 1 0 0 0

—————————— ——

0 0 1 1 1 1 0

Wie aus der obigen Abbildung ersichtlich ist, lautet das Ergebnis der Multiplikationsberechnung: Wenn der Wert des Multiplikatorbits 1 ist, verschieben Sie den Multiplikanden um den entsprechenden Wert nach links Anzahl der Ziffern und schließlich das durch Verschieben dieser Bits nach links erhaltene Ergebnis. Addieren Sie das Endergebnis in Echtzeit.

<?php
    require &#39;addition.php&#39;;

    function multiply($multiplicand, $multiplicator)
    {
        // 判断符号位
        $flag = ($multiplicand ^ $multiplicator) < 0 ? false : true;
        //  被乘数和乘数取绝对值
        $multiplicand = $multiplicand < 0 ? add(~$multiplicand, 1) : $multiplicand;
        $multiplicator = $multiplicator < 0 ?  add(~$multiplicator, 1) : $multiplicator;

        $product = 0;
        $multiplicator = decbin($multiplicator);
        $length = strlen($multiplicator);

        for ($i = 0; $i < $length; $i ++) {
            if ($multiplicator[$i]) {
                $product += $multiplicand << $length - $i - 1;
            }
        }

        if (! $flag) {
            $product = add(~$product, 1);
        }

        return $product;
    }

⒋ Die Division

ähnelt der Multiplikation und gibt an, wie viele Teiler vom Dividenden abgezogen werden können.

<?php
    require &#39;addition.php&#39;;

    function divide($dividend, $divisor)
    {
        //  判断符号位
        $flag = ($dividend ^ $divisor) < 0 ? false : true;
        //  取得被除数符号位
        $dividend_flag = $dividend < 0 ? false : true;
        // 取绝对值
       $dividend = $dividend < 0 ? add(~$dividend, 1) : $dividend;
       $divisor = $divisor < 0 ? add(~$divisor, 1) : $divisor;

       $quotient = 0;
       $remainder = 0;

       if ($dividend < $divisor) {
           // 被除数小于除数的情况
           $remainder = $dividend;
           return &#39;quotient = &#39; . $quotient . &#39; remainder = &#39; . $remainder;
       }

       while ($dividend >= $divisor) {
           $i = 0;
           $mul_divisor = $divisor;

           while ($dividend >= ($mul_divisor << 1)) {
               $i ++;
               $mul_divisor <<= 1;
           }

           $dividend -= $mul_divisor;
           $quotient += 1 << $i;
       }

      $remainder = $dividend;
      if (! $flag) {
          $quotient = add(~ $quotient, 1);
      }
      if (! $dividend_flag) {
          $remainder = add(~$remainder, 1);
      }

      return &#39;quotient = &#39; . $quotient . &#39; remainder = &#39; . $remainder;
    }
Oben.

Es sollte darauf hingewiesen werden, dass der obige Code bei seiner erfolgreichen Implementierung keinen Datenüberlauf berücksichtigte.

Die Addition zweier sehr großer Zahlen kann überlaufen; die Subtraktion einer positiven Zahl von einer negativen Zahl kann ebenfalls überlaufen; die Multiplikation zweier großer Zahlen kann ebenfalls überlaufen;

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion darüber, wie man Bitoperationen verwendet, um Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen in PHP zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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