現在の位置: ホーム> 最新記事一覧> 正と負の数を扱うときのbindec()関数の違いは何ですか?

正と負の数を扱うときのbindec()関数の違いは何ですか?

M66 2025-06-02

PHPでは、 bindec()関数を使用して、バイナリ文字列を小数点に変換します。その構文は非常にシンプルです:

 int bindec ( string $binary_string )

ここで、 $ binary_stringは、バイナリ番号を表す01のみを含む文字列です。


正の数処理

入力バイナリ文字列が正の数値を表すと、 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. 最高のビットを決定する(最高ビットは1の場合、負と見なされる)

  2. 数値が負の場合、補数コードに変換されます。

サンプルコードは次のとおりです。

 <?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()は正しい負の値を直接与えることはできず、単独で余分に処理する必要があります。

  • マイナス数の正しい変換は、最高ビットを判断し、補体計算を組み合わせることで達成できます。