PHPでは、 bindec()関数を使用して、バイナリ文字列を小数点に変換します。その構文は非常にシンプルです:
int bindec ( string $binary_string )
ここで、 $ binary_stringは、バイナリ番号を表す0と1のみを含む文字列です。
入力バイナリ文字列が正の数値を表すと、 Bindec()はそれを対応する小数に直接変換します。例えば:
<?php
echo bindec("1010"); // 出力 10
echo "\n";
echo bindec("1111"); // 出力 15
?>
ここでは、バイナリ文字列「1010」と「1111」は、それぞれ10進数と15に変換されます。これはBindec()の最も一般的な使用法であり、結果はまさに予想通りです。
署名された整数の表現とは異なり、 bindec()関数は、バイナリ文字列が負の数を表すかどうかを自動的に識別しません。常に署名されていないバイナリ数として入力を10進数に変換します。したがって、負の数を直接表す補体(バイナリ形式)文字列を渡すと、結果は大きな正の整数になります。
例えば:
<?php
echo bindec("11111111"); // 出力 255,その代わり -1
echo "\n";
echo bindec("10000000"); // 出力 128,その代わり -128
?>
ここでは、 「11111111」は8ビットの署名された整数で-1を表しますが、 bindec()はそれを直接署名していない255と見なします。同様に、 「10000000」は8ビットの補数で-128ですが、関数は128を返します。
バイナリ文字列に基づいて負の数値を処理する必要がある場合は、補体コードの判断と変換を自分で実装する必要があります。簡単な方法は次のとおりです。
最高のビットを決定する(最高ビットは1の場合、負と見なされる)
数値が負の場合、補数コードに変換されます。
サンプルコードは次のとおりです。
<?php
function bindec_signed($bin) {
$num = bindec($bin);
$bits = strlen($bin);
// 最高のビットかどうかを判断します1(負の数字フラグ)
if ($bin[0] === '1') {
// 補数コードの負の値を計算します
$num -= (1 << $bits);
}
return $num;
}
// テスト
echo bindec_signed("11111111"); // 出力 -1
echo "\n";
echo bindec_signed("10000000"); // 出力 -128
echo "\n";
echo bindec_signed("01111111"); // 出力 127
?>
この関数は、補数コードの数学的原理を使用して、バイナリ数の最高ビットを判断し、正しい正と負の変換を行います。
Bindec()関数は、デフォルトでバイナリ文字列を符号なしの数値として使用し、出力の結果は常に正の整数またはゼロです。
負の数を表す2つの補完の場合、 bindec()は正しい負の値を直接与えることはできず、単独で余分に処理する必要があります。
マイナス数の正しい変換は、最高ビットを判断し、補体計算を組み合わせることで達成できます。