PHPでは、異なる数字間で変換を処理することは一般的なタスクです。 bindec()関数は、PHPによってネイティブに提供される関数であり、変換に特異的に使用されます。この記事では、 bindec() 、変換ロジック、およびPHPの整数型(INT)との関係の実装メカニズムの詳細な分析を実施します。
bindec()は、バイナリ文字列を引数として取り、対応する小数整数を返します。例えば:
echo bindec("1010"); // 出力 10
この例はシンプルで直感的で、バイナリ1010を10進数として解釈します10 。
bindec()は数字ではなく文字列を受信することに注意する必要があります。入力が純粋に数値形式であっても、文字列でなければなりません。
bindec("1101"); // 正しい
bindec(1101); // お勧めしません,混乱を引き起こす可能性があります
bindec()は、各ビットを文字列に0または1に扱い、右から左にビットワイズの重み(2^n)を合計することにより、基本的に変換を実現します。
例としてBindec( "1101")を取ります。
1*(2^3) + 1*(2^2) + 0*(2^1) + 1*(2^0)
= 8 + 4 + 0 + 1
= 13
この処理ロジックは、標準のバイナリから小数アルゴリズムと非常に一致しています。 PHPはC言語を通じて内部的に実装されており、非常に効率的です。
PHPの整数タイプは上限です(プラットフォームに応じて32ビットまたは64ビット)。ただし、 Bindec()はこの範囲に限定されません。バイナリ文字列がPHP intの最大値を超えると、タイプフロートの返された値はフロートになります。
例:
echo bindec("1111111111111111111111111111111111111111111111111111111111111111");
// 出力 18446744073709551615(64 個々 1)
64ビットプラットフォームでは、この結果は整数として返される可能性があります。 32ビットプラットフォームでは、結果が浮動小数点数になります。
さらに、浮動小数点の最大精度を超えた場合、結果は不正確になります。したがって、非常に長いバイナリ文字列を扱う場合、 BCMATHまたはGMP拡張機能を考慮する必要があります。
多くの開発者は、 bindec()とdecbin()を組み合わせて使用して、パーティション間で往復変換を形成します。
$dec = bindec("100101");
$bin = decbin($dec);
echo $bin; // 出力 100101
この相互運用性は完全に信頼性がありますが、入力バイナリ文字列がフォーマット仕様に準拠し、 0および1以外の文字を含めることができない場合のみです。
bindec()は、非バイナリ文字の後にパーツを無視します。例えば:
echo bindec("11012"); // 出力 13,"2" 無視した
これは、PHPのbindec()が「耐性」であるが厳格ではないことを示しています。したがって、電話をかける前に入力検証を実行することをお勧めします。
function is_valid_binary($str) {
return preg_match('/^[01]+$/', $str);
}
この検証を使用すると、潜在的な論理エラーを回避できます。
bindec()は整数(または大きな整数のときにフロート)を返しますが、その入力は常に文字列です。これは、下部にあるPHPの動的タイプシステムによって行われた暗黙の変換を反映しています。 PHPはタイプの宣言を強制しませんが、インターフェイスを設計するときは、ランタイムエラーを減らすために予想されるタイプを明示的に設計する必要があります。
たとえば、アレイインデックスまたはビット操作のbindec()出力の結果に関数が依存している場合、強制型チェックが特に重要です。
一般的なユースケースは、バイナリを使用して複数の許可フラグを表す許可システムです。例えば:
$binaryPermission = "1011"; // 代表四個々権限:第1、第2そして4個々启用
$permissions = bindec($binaryPermission);
// を確認してください3ビットです1(右から左にカウントします)
if ($permissions & (1 << 2)) {
echo "権限3有効になっています";
}
この状況では、 Bindec()は、許可フラグの文字列を整数ビットマスクに効率的に変換し、ビット操作で状態をすばやく決定できます。