尝试将一个二进制补码16位数转换为有符号十进制数

3

我正在尝试(使用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的补码形式从陀螺仪读取每个轴的两个字节。

提前感谢!

Sam

2个回答

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上有效。如果需要进一步解释,请告诉我。
--ap


1
太好了!我的陀螺仪正在读取数据!谢谢。现在我只需要将你的代码返回的十进制数转换成角度。 - user1955162

0
这是适用于 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接