>  기사  >  백엔드 개발  >  PHP에서 비트 연산을 사용하여 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 구현하는 방법에 대한 간략한 설명

PHP에서 비트 연산을 사용하여 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 구현하는 방법에 대한 간략한 설명

青灯夜游
青灯夜游앞으로
2021-07-08 18:45:323092검색

PHP는 어떻게 비트 연산을 사용하여 네 가지 산술 연산을 구현하나요? 이 기사에서는 비트 연산을 사용하여 PHP에서 네 가지 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈)을 구현하는 방법을 소개합니다.

PHP에서 비트 연산을 사용하여 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 구현하는 방법에 대한 간략한 설명

컴퓨터의 가장 기본적인 연산 단위는 바이트(byte)입니다. 바이트는 8비트로 구성되며, 비트는 0 또는 1 하나만 저장할 수 있습니다. 컴퓨터의 모든 데이터는 1과 0의 인코딩인 이진수로 저장되고 작동됩니다.

이번에는 비트 연산을 사용하여 PHP에서 네 가지 산술 연산을 구현해 봅니다. 먼저 몇 가지 기본 개념을 소개합니다.

원본 코드: 최상위 비트를 부호 비트로 사용하고(0은 양수, 1은 음수를 의미) 다른 디지털 비트는 절대값 자체를 나타냅니다. 값

1의 보수: 양수의 1의 보수는 원래 코드와 동일합니다. 음수인 경우 부호 비트는 변경되지 않고 다른 비트는 반전됩니다.

일의 보수: 양수의 일의 보수는 원래 코드와 동일합니다. 음수의 일의 보수는 일의 보수에 1을 더한 것입니다.

컴퓨터의 숫자는 보수 코드

형식으로 저장됩니다. ⒈ 추가

이진수에는 0과 1만 있고, 0 + 0도 0 + 1도 캐리가 필요하지 않지만 1 + 1은 캐리가 필요합니다. 따라서 캐리가 필요하지 않은 비트를 추가한 결과를 얻으려면 먼저 또는 작업을 사용하세요. 그런 다음 연산을 수행하고 추가된 두 비트가 모두 1이면 결과는 1입니다. 따라서 AND 연산의 결과가 0보다 크다면, 이때 AND 연산의 결과는 왼쪽으로 1비트 이동한다는 의미이다. Shift를 OR 연산의 결과와 결합하여 AND 연산의 결과가 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;
    }

⒉ 빼기

빼기는 음수 빼기를 사용한 덧셈으로 볼 수 있습니다. 예를 들어 2 - 1은 2 + (-1)로 볼 수 있습니다.

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

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

        return add($minuend, $subtrahend);
    }

⒊ 곱셈

곱셈은 덧셈의 변형으로 간주될 수도 있습니다. 예를 들어 m * n은 n m을 덧셈한 결과로 간주될 수 있습니다. 그러나 비트 연산을 사용하여 곱셈을 구현하는 더 빠른 방법이 있습니다. 예를 들어 3 * 10: 3의 이진수 표현은 0011이고, 10의 이진수 표현은 1010

​​​​​​ 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

위 그림에서 알 수 있듯이 곱셈 계산의 결과는 즉, 승수 비트의 값이 1일 때 해당 자릿수만큼 피승수를 왼쪽으로 이동하고, 마지막으로 이 비트를 왼쪽으로 이동한 결과를 실시간으로 합산합니다.

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

⒋ 나눗셈

은 곱셈과 유사합니다. 나눗셈은 피제수에서 몇 개의 제수를 뺄 수 있는지로 볼 수 있습니다.

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

위 코드는 성공적으로 구현되었을 때 데이터 오버플로를 고려하지 않았다는 점에 유의해야 합니다.

두 개의 큰 숫자의 덧셈은 오버플로될 수 있습니다. 음수에서 양수를 빼는 것도 오버플로될 수 있습니다. 0으로 나눈 두 개의 숫자의 곱셈도 오버플로될 수 있습니다.

추천 학습: "

PHP 비디오 튜토리얼

"

위 내용은 PHP에서 비트 연산을 사용하여 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 구현하는 방법에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제