【问题标题】:Trying to read a two's complement 16bit into a signed decimal试图将二进制补码 16 位读入有符号十进制
【发布时间】:2013-04-13 23:51:49
【问题描述】:

我正在尝试(在 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 的补码形式读取两个字节。

提前致谢!

山姆

【问题讨论】:

    标签: php python math binary


    【解决方案1】:

    假设这个 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。如果您需要进一步的解释,请告诉我。
    --ap

    【讨论】:

    • 行得通!我正在从我的陀螺仪上读取数据!谢谢。我现在要做的就是将您的代码返回的小数转换为度数。
    【解决方案2】:

    以下是 ec-2 Amazon Linux x64 发行版 PHP 5.3.27 的版本,可转换 32 位二进制字符串:

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

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      相关资源
      最近更新 更多