如何在 Octave 中将两个 8 位数字合并为 16 位

How to combine two 8-bit numbers to 16-bit in Octave

我正在处理来自 GY-87(acc 和陀螺仪传感器模块)的数据,我从它收到的数据的格式为 ACCEL_YOUT_HIGH & ACCEL_YOUT_LOW轴分别指定 HIGH 和 LOW 值。有人告诉我 "High and Low registers are 8-bit in nature, therefore the combination of both will be a 16-bit signed data"。但我真的不知道如何将它们组合成 16 位数据。这是一个示例:ACCEL_YOUT_HIGH=254 ACCEL_YOUT_LOW=144

我已经尝试过 JAVAScript 方法,但它在八度音程中不起作用。

var number8Bit1 = firstNumber & 0xff;
var number8Bit2 = ((firstNumber >> 8) & 0xff);

由于您的数据是 16 位签名的,我认为最优雅的解决方案是使用 typecast(正如安迪评论的那样)。

要使类型转换解决方案正常工作,您需要执行以下操作:

  1. 将每个值转换为 uint8
  2. 从两个 uint8 元素构建一个数组(将较低的元素放在第一位,因为我们的系统是 little-endian
  3. 使用 typecast 将两个字节转换为单个 int16 元素。
  4. 将结果转换为 double(您可以跳过这部分,但这是一种常见的做法 - 以防您需要对结果应用计算)。

代码示例:

high = 254;
low = 144; 
res = double(typecast([uint8(low), uint8(high)], 'int16'))

结果:

res = -368

如果您想使用纯数学运算(如 Sami 评论的那样),您可以按以下方式进行:

res = high*256 + low;
if (res >= 2^15)
    res = res - 2^16; %Correct the sign.
end

我觉得不太优雅,因为if 语句不清楚...


您还可以使用 bitshiftbitortypecast(正如 Cris 评论的那样)。
看起来像 C 代码 res = (short)((high << 8) | low):

res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');

我发现它不如第一个解决方案优雅,因为移位和/或操作在 MATLAB / Octave 中不自然...