php 2进制转带正负号的整数

php

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