我们如何在Matlab中进行这种位级操作:
int instructionWord;
a = (instructionWord >>> 21) & 0x1F;
代码右移指令字21并获得最少5位。如何在Matlab中等效地完成?
答案 0 :(得分:5)
鉴于您的输入值是整数,您可以执行以下操作:
a = mod( floor(instructionWord/2^21), 32)
另一个更像位的解决方案是:
a = bitand( bitshift(instructionWord, -21), hex2dec('1F'))
如果你输入除了整数之外的任何东西,最后一个方法会抛出一个错误。
顺便说一句,你的变量instructionWord被声明为有符号整数。但如果它是一个指令字或类似的东西,无符号整数会更有意义。上面的表达式期望您的输入只是正数。如果没有,则需要更多代码来模拟matlab中的>>>
(逻辑右移)。
答案 1 :(得分:3)
请参阅bitshift页面:
<强>代码强>
a = intmax('uint8');
s1 = 'Initial uint8 value %5d is %08s in binary\n';
s2 = 'Shifted uint8 value %5d is %08s in binary\n';
fprintf(s1,a,dec2bin(a))
for i = 1:8
a = bitshift(a,1);
fprintf(s2,a,dec2bin(a))
end
<强>输出强>
Initial uint8 value 255 is 11111111 in binary
Shifted uint8 value 254 is 11111110 in binary
Shifted uint8 value 252 is 11111100 in binary
Shifted uint8 value 248 is 11111000 in binary
Shifted uint8 value 240 is 11110000 in binary
Shifted uint8 value 224 is 11100000 in binary
Shifted uint8 value 192 is 11000000 in binary
Shifted uint8 value 128 is 10000000 in binary
Shifted uint8 value 0 is 00000000 in binary
修改强> 请参阅bitget页面,了解如何提取特定的比特值。
答案 2 :(得分:2)
a = rem(bitshift(instructionWord,-21),2 ^ 5)
bitshift 执行位移位;并且 rem 在除以32的余数中找到最后5位的值。