PHPでは、 bindec()関数を使用して、バイナリ文字列を小数点に変換します。その基本的な使用法は非常に簡単です:
<?php
$binary = "1101";
$decimal = bindec($binary);
echo $decimal; // 出力 13
?>
ただし、バイナリ文字列が非常に長い場合、特にPHPが正確に表すことができる範囲を超える場合、 Bindec()は、浮遊点精度の制限のためにエラーをもたらす可能性があります。これは、 bindec()が浮動小数点数タイプの値を返し、PHPの浮動小数点数の精度が制限されており、正確に表現できる整数数字の最長数は約15桁です。
PHPフローティングポイント数はIEEE 754の二重精度標準に基づいており、その精度制限により、バイナリ文字列が特定の長さを超えると、変換結果が丸くなり、不正確な値が得られます。例えば:
<?php
$longBinary = "111111111111111111111111111111111111"; // 35ビットバイナリ
echo bindec($longBinary); // 結果は不正確である可能性があります
?>
この場合、 bindec()によって返された結果は、浮動ポイントの精度の制限によりエラーを引き起こします。
PHPのBCMATH拡張機能は、任意の長さ数値操作をサポートします。これは、変動点の精度の損失を回避するために、バイナリを手動でデシマルに実装するために使用できます。
<?php
function bindec_bcmath(string $binary): string {
$decimal = '0';
$len = strlen($binary);
for ($i = 0; $i < $len; $i++) {
$decimal = bcmul($decimal, '2');
if ($binary[$i] === '1') {
$decimal = bcadd($decimal, '1');
}
}
return $decimal;
}
$longBinary = "111111111111111111111111111111111111";
echo bindec_bcmath($longBinary); // 正確な変換
?>
GMP(GNU Multi-Precision)拡張機能も大規模な操作をサポートし、バイナリ文字列から直接変換する方法を提供します。
<?php
$longBinary = "111111111111111111111111111111111111";
$decimal = gmp_strval(gmp_init($longBinary, 2), 10);
echo $decimal;
?>
この方法はシンプルで効率的で、多数の処理に適しています。
セグメント化によってバイナリ文字列を小数点に変換することも実行できますが、実装はより複雑で非効率的です。 BCMATHまたはGMPが推奨されます。
Bindec()は、短いバイナリ文字列の変換に適しており、浮動小数点の精度制限を超えるとエラーが発生します。
BCMATHまたはGMP拡張機能を使用すると、精度の損失を回避し、多数を正しく変換できます。