我正在对二进制数据进行分析。假设我有两个 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
中使用稍后操作。
我当前的解决方案是:
制作
a|b
(a
或b
):temp1 = bitor(bitshift(uint16(a), 8), uint16(b));
左移六位以删除
a
中的高六位:temp2 = bitshift(temp1, 6);
右移六位以去除先前结果中的低零:
temp3 = bitshift(temp2, -6);
将所有这些放在一行:
result = bitshift(bitshift(bitor(bitshift(uint16(a), 8), uint16(b)), 6), -6);
这看起来效率不高,对吧?我只想得到(a[2:1] << 8) | b
,并且需要很长的表达式才能获取值。
请告诉我是否有针对此问题的众所周知的解决方案。
最佳答案
由于您使用的是 Octave,因此可以使用 bitpack
和 bitunpack
:
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/