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 'addition.php'; 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 'addition.php'; 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; }로그인 후 복사
은 곱셈과 유사합니다. 나눗셈은 피제수에서 몇 개의 제수를 뺄 수 있는지로 볼 수 있습니다. 두 개의 큰 숫자의 덧셈은 오버플로될 수 있습니다. 음수에서 양수를 빼는 것도 오버플로될 수 있습니다. 0으로 나눈 두 개의 숫자의 곱셈도 오버플로될 수 있습니다. 추천 학습: " " 위 내용은 PHP에서 비트 연산을 사용하여 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 구현하는 방법에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!<?php
require 'addition.php';
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 'quotient = ' . $quotient . ' remainder = ' . $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 'quotient = ' . $quotient . ' remainder = ' . $remainder;
}