php에서, bindec () 는 이진 문자열을 소수점 숫자로 변환하기위한 매우 실용적인 기능이다. 기본 사용량은 매우 간단합니다.
echo bindec('1010'); // 산출 10
그러나 들어오는 바이너리 스트링이 너무 길고 PHP가 지원하는 정수 범위를 초과하면 어떻게됩니까? 이것은 특히 많은 숫자를 다루거나 고정밀 계산이 필요할 때 탐색 할 가치가있는 질문입니다.
우선, PHP의 정수 ( INT ) 범위가 기본 플랫폼에 의해 제한되어 있음을 이해해야합니다. 대부분의 64 비트 시스템에서 PHP_INT_MAX 는 922372036854775807 이며, 이는 2 <pup> 63 </sup> -1과 거의 같습니다. 32 비트 시스템의 경우 2147483647 만 있습니다.
전달 된 바이너리 문자열로 표시되는 값 이이 범위를 초과하면 Bindec ()가 반환 값을 플로트 유형으로 자동 변환합니다. 이 동작은 PHP의 유형 변환 메커니즘의 일부이며 정확도 손실을 초래할 수 있습니다.
예를 살펴 보겠습니다.
$binary = '11111111111111111111111111111111111111111111111111111111111111111';
$result = bindec($binary);
var_dump($result);
이 바이너리 스트링의 길이는 65 비트이며 64 비트 정수의 최대 값보다 훨씬 큽니다. 작업 결과는 다음과 같습니다.
float(1.84467440737096E+19)
보시다시피, 반환 값은 부동 소수점 번호이며 과학 표기법으로 표현됩니다. 이것은 또한 다음을 의미합니다.
정확도는 더 이상 정확하지 않을 수 있습니다.
추가 수학적 계산 에이 결과를 사용하면 예측할 수없는 오류가 도입 될 수 있습니다.
정수 범위를 정확하게 초과하는 이진수를 처리 해야하는 경우 PHP의 BCMATH 또는 GMP 확장을 고려하십시오.
BCMath 사용 :
$binary = '10101010101010101010101010101010101010101010101010101010101010101';
$decimal = '0';
$length = strlen($binary);
for ($i = 0; $i < $length; $i++) {
$bit = $binary[$i];
$power = bcpow('2', $length - $i - 1);
if ($bit === '1') {
$decimal = bcadd($decimal, $power);
}
}
echo $decimal; // 산출精确的十进制值
GMP 사용 :
$binary = '10101010101010101010101010101010101010101010101010101010101010101';
$gmp = gmp_init($binary, 2);
echo gmp_strval($gmp); // 精确산출
BCMATH는 더 나은 호환성을 가진 순수한 PHP 구현입니다. GMP 라이브러리는 성능이 강하지 만 서버 지원이 필요합니다.
IP 주소 처리, 비트 허가 관리, 암호화 알고리즘 등과 같은 일부 데이터 처리 시나리오에서는 대규모 이진 데이터 처리가 일반적인 작업입니다. bindec ()를 직접 사용하는 경우 다음과 같습니다.
bindec('1001011100101101001010010010101010010101010101010101010101010101');
그리고이를 사용자 권한 마스크로 사용하려고 시도하면 후속 판단에서 정확성이 떨어질 수 있으며 보안 위험이 있습니다. 수치 정확도를 보장하기 위해 BCMATH 또는 GMP가 선호되어야합니다.
Bindec ()는 중소형 바이너리 문자열을 처리 할 때 효율적이고 편리하지만 입력 데이터가 PHP 정수 범위를 벗어나면 동작이 자동으로 플로팅 포인트 유형으로 돌아 가기 때문에 정확도 문제가 발생할 수 있습니다. 개발자는 고 비트 바이너리 숫자를 다룰 때 더욱주의를 기울여야하며, 데이터 정확도를 보장하기 위해 필요한 경우 고소득 수학 라이브러리를 사용해야합니다.