php 2进制转带正负号的整数
24-5-27 10:22:26
function binaryStringToSignedDecimal($binaryString) {
// 确保二进制字符串长度为 16 位(或根据需要调整)
$expectedLength = 16;
if (strlen($binaryString) !== $expectedLength) {
throw new Exception("Binary string must be exactly {$expectedLength} bits long.");
}
// 将二进制字符串转换为十进制整数(忽略符号位,先假设为正数)
$decimal = bindec($binaryString);
// 检查最高位(符号位)
if ($binaryString[0] === '1') {
// 如果是 1,表示是负数,需要转换为补码表示的负数
// 对于补码,取反加 1 得到原码(绝对值),然后再取反得到负数
$decimal = -(($decimal ^ (pow(2, $expectedLength) - 1)) + 1);
}
return $decimal;
}
// 示例使用
$binaryString = '1111111111100100'; // 对应的十进制是 -28(补码表示)
$signedDecimal = binaryStringToSignedDecimal($binaryString);
echo "The signed decimal integer corresponding to binary {$binaryString} is: {$signedDecimal}\n";
// 输出应该是:
// The signed decimal integer corresponding to binary 1111111111100100 is: -28