matlab - 如何正确地进行按位运算?

标签 matlab bit-manipulation octave

我正在对二进制数据进行分析。假设我有两个 uint8 数据值:

a = uint8(0xAB);
b = uint8(0xCD);

我想从 a 中取出低两位,以及 b 的全部内容,生成 10 位值。在 C 风格中,它应该是这样的:

(a[2:1] << 8) | b

我试过bitget :

bitget(a,2:-1:1)

但这只是给了我单独的 [1, 1]逻辑类型值,不是标量,不能在 bitshift 中使用稍后操作。

我当前的解决方案是:

  1. 制作a|b ( ab ):

    temp1 = bitor(bitshift(uint16(a), 8), uint16(b));

  2. 左移六位以删除 a 中的高六位:

    temp2 = bitshift(temp1, 6);

  3. 右移六位以去除先前结果中的低零:

    temp3 = bitshift(temp2, -6);

将所有这些放在一行:

result = bitshift(bitshift(bitor(bitshift(uint16(a), 8), uint16(b)), 6), -6);

这看起来效率不高,对吧?我只想得到(a[2:1] << 8) | b ,并且需要很长的表达式才能获取值。

请告诉我是否有针对此问题的众所周知的解决方案。

最佳答案

由于您使用的是 Octave,因此可以使用 bitpackbitunpack:

octave> a = bitunpack (uint8 (0xAB))
a =

   1   1   0   1   0   1   0   1

octave> B = bitunpack (uint8 (0xCD))
B =

   1   0   1   1   0   0   1   1

一旦您以这种形式获得它们,就可以很容易地做您想做的事情:

octave> [B A(1:2)]
ans =

   1   0   1   1   0   0   1   1   1   1

然后只需相应地填充零并将其打包回整数:

octave> postpad ([B A(1:2)], 16, false)
ans =

   1   0   1   1   0   0   1   1   1   1   0   0   0   0   0   0

octave> bitpack (ans, "uint16")
ans = 973

关于matlab - 如何正确地进行按位运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30181088/

相关文章:

不明白 CBLAS 是如何工作的

matlab - 重置用于在 Matlab/Octave 中绘图的 ColorOrder 索引

matlab - 如何使用 MATLAB 中的线或注释对象绘制轴外的对象?

matlab - 如何将矩阵的行连接成一个向量?

matlab - 如何将函数应用于矩阵中的所有行?

c++ - 设置位是否与同一个字上的并发其他位集发生冲突?

c++ - 我如何将 Octave (matlab 克隆)与 qt creator 集成

Python,文字检测OCR

binary - 二元 NOT (~) 运算符如何工作?

c++ - 在位数组中找到 N 个 1 位的字符串