如何在 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(正如安迪评论的那样)。
要使类型转换解决方案正常工作,您需要执行以下操作:
- 将每个值转换为
uint8
- 从两个
uint8
元素构建一个数组(将较低的元素放在第一位,因为我们的系统是 little-endian)
- 使用
typecast
将两个字节转换为单个 int16
元素。
- 将结果转换为
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
语句不清楚...
您还可以使用 bitshift、bitor
和 typecast
(正如 Cris 评论的那样)。
看起来像 C 代码 res = (short)((high << 8) | low)
:
res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');
我发现它不如第一个解决方案优雅,因为移位和/或操作在 MATLAB / 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(正如安迪评论的那样)。
要使类型转换解决方案正常工作,您需要执行以下操作:
- 将每个值转换为
uint8
- 从两个
uint8
元素构建一个数组(将较低的元素放在第一位,因为我们的系统是 little-endian) - 使用
typecast
将两个字节转换为单个int16
元素。 - 将结果转换为
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
语句不清楚...
您还可以使用 bitshift、bitor
和 typecast
(正如 Cris 评论的那样)。
看起来像 C 代码 res = (short)((high << 8) | low)
:
res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');
我发现它不如第一个解决方案优雅,因为移位和/或操作在 MATLAB / Octave 中不自然...