Maison  >  Article  >  développement back-end  >  Une brève discussion sur la façon d'utiliser les opérations sur les bits pour implémenter les opérations d'addition, de soustraction, de multiplication et de division en PHP

Une brève discussion sur la façon d'utiliser les opérations sur les bits pour implémenter les opérations d'addition, de soustraction, de multiplication et de division en PHP

青灯夜游
青灯夜游avant
2021-07-08 18:45:323092parcourir

Comment PHP utilise-t-il les opérations sur les bits pour implémenter quatre opérations arithmétiques ? Cet article vous présentera comment utiliser les opérations sur les bits pour implémenter les quatre opérations arithmétiques (addition, soustraction, multiplication et division) en PHP.

Une brève discussion sur la façon d'utiliser les opérations sur les bits pour implémenter les opérations d'addition, de soustraction, de multiplication et de division en PHP

L'unité opérationnelle la plus basique d'un ordinateur est un octet. Un octet est composé de 8 bits, et un bit ne peut stocker qu'un 0 ou un 1. Toutes les données de l'ordinateur sont stockées et exploitées en binaire, c'est-à-dire le codage de 1 et 0.

Cette fois, j'essaie d'utiliser des opérations sur bits pour implémenter quatre opérations arithmétiques en PHP. Tout d'abord, j'introduis quelques concepts de base :

Code original : utilisez le bit le plus élevé comme bit de signe (0 signifie positif, 1 signifie négatif), et les autres bits numériques représentent la valeur absolue de la valeur elle-même Valeur

Complément à un : Le complément à un d'un nombre positif est le même que le code d'origine s'il s'agit d'un nombre négatif, le bit de signe reste inchangé, et les autres bits ; sont inversés

Complément à un : Le complément à un d'un nombre positif est le même que le code d'origine ; Le complément à un d'un nombre négatif est le complément à un plus 1

Les nombres dans les ordinateurs sont stockés sous la forme de code complémentaire

⒈ Addition

Il n'y a que 0 et 1 en binaire Ni 0 + 0 ni 0 + 1 ne nécessitent un report, mais 1 + 1 oui. Par conséquent, utilisez d’abord l’opération ou pour obtenir le résultat de l’ajout des bits qui ne nécessitent pas de report. Effectuez ensuite les opérations de et , et lorsque les deux bits ajoutés sont tous deux égaux à 1, le résultat est 1. Par conséquent, si le résultat de l'opération ET est supérieur à 0, cela signifie qu'un report est requis. À ce moment, le résultat de l'opération ET est décalé de 1 bit vers la gauche. Le décalage est combiné avec le résultat de l'opération OU et le processus d'opération ci-dessus est répété jusqu'à ce que le résultat de l'opération ET soit Le résultat est 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;
    }

⒉ Soustraction

La soustraction peut être vue comme une addition avec un soustracteur négatif, par exemple 2 - 1 peut être vu comme 2 + (-1).

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

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

        return add($minuend, $subtrahend);
    }

⒊ Multiplication

La multiplication peut également être considérée comme une variante de l'addition, par exemple, m * n peut être considéré comme le résultat de l'addition de n m. Mais il existe un moyen plus rapide d’implémenter la multiplication en utilisant des opérations au niveau du bit. Par exemple, 3 * 10 : La représentation binaire de 3 est 0011 et la représentation binaire de 10 est 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

Comme le montre la figure ci-dessus, le résultat du calcul de multiplication est : lorsque la valeur du bit multiplicateur est 1, décalez le multiplicande vers la gauche de la valeur correspondante nombre de chiffres, et enfin le résultat obtenu en décalant ces bits vers la gauche Additionnez le résultat final en temps réel.

<?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;
    }

⒋ La division

est similaire à la multiplication. La division peut être vue comme le nombre de diviseurs qui peuvent être soustraits du dividende.

<?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;
    }

et plus.

Il convient de souligner que le code ci-dessus n'a pas pris en compte le débordement de données lorsqu'il a été implémenté avec succès. L'addition de deux très grands nombres peut déborder ; la soustraction d'un nombre positif d'un nombre négatif peut également déborder ; la multiplication de deux grands nombres peut également déborder ; tout nombre divisé par 0 peut déborder.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer