在 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() 函数不会自动识别二进制字符串是否代表负数。它总是把输入当成无符号的二进制数转换为十进制。因此,如果直接传入代表负数的补码(二进制形式)字符串,结果会是一个很大的正整数。
举个例子:
<?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() 函数默认把二进制字符串当成无符号数来处理,输出的结果永远是正整数或零。
对于表示负数的二进制补码,bindec() 不能直接给出正确的负数值,需要自己额外处理。
可以通过判断最高位并结合补码计算,实现对负数的正确转换。