试图将二进制补码16位读入带符号的十进制数

时间:2013-04-20 19:04:09

标签: php python math binary

我正在尝试(在PHP中)读取两个字节(16位)的二进制补码值并返回带符号的十进制数。

我不确定这两个恭维数学应该如何工作,但是从php.net,我设法得到它几乎是为了表明我的期望。我认为我遇到的问题是我没有得到任何负面价值。

我的代码:

function _bin16dec($bin) {
    // Function to convert 16bit binary numbers to integers using two's complement
    $num = bindec($bin);
    if($num > 0xFFFF) { return false; }
    if($num >= 0x8000) {
        return -(($num ^ 0xFFFF)+1);
    } else {
        return $num;
    }
}

这个代码是有人在网上提出的,但它在python中不明白。

def twoscomp( x ) :
   "This returns a 16-bit signed number (two's complement)"
   if (0x8000 & x): 
   x = - (0x010000 - x)
return x

应用程序从陀螺仪中为2的恭维形式中的每个轴读取两个字节。

提前致谢!

山姆

2 个答案:

答案 0 :(得分:5)

假设这个Python函数符合你的期望......

def twoscomp( x ) :
    """This returns a 16-bit signed number (two's complement)"""
    if (0x8000 & x): 
        x = - (0x010000 - x)
    return x

...这个PHP函数应该做同样的事情。

function _bin16dec($bin) {
    // converts 16bit binary number string to integer using two's complement
    $num = bindec($bin) & 0xFFFF; // only use bottom 16 bits
    if (0x8000 & $num) {
        $num = - (0x010000 - $num);
    }
    return $num;
}

此代码适用于PHP 5.3.15。如果您想进一步解释,请与我们联系 留学美国相关考试

答案 1 :(得分:0)

这是一个用于转换32位二进制字符串的ec-2 Amazon Linux x64发行版PHP 5.3.27的版本:

function _bin32dec($bin) {
  $num = bindec($bin) & 0xFFFFFFFF;
  if (0x80000000 & $num) {
    $num = - (0xFFFFFFFF - $num + 1);
  }
  return $num;
}