我正在尝试获取数字的二进制值,例如
de2bi(234)
这导致我得到这个答案:
0 1 0 1 0 1 1 1
现在我想要的是它的相反顺序而不像这样改变它的值:
11101010
我已经尝试过bitrevorder()
功能,但我没有我想要的答案。任何帮助和建议将不胜感激。
我正在尝试获取数字的二进制值,例如
de2bi(234)
这导致我得到这个答案:
0 1 0 1 0 1 1 1
现在我想要的是它的相反顺序而不像这样改变它的值:
11101010
我已经尝试过bitrevorder()
功能,但我没有我想要的答案。任何帮助和建议将不胜感激。
例子:
>>de2bi(234)
ans = 0 1 0 1 0 1 1 1
>> fliplr(ans)
ans =
1 1 1 0 1 0 1 0
使用功能fliplr。它可以用来反转数组的顺序。
尝试使用标志'left-msb'
(根据http://www.mathworks.com/help/comm/ref/de2bi.html中的文档)
下面的命令显示了如何在不指定输出矩阵中的列数的情况下将十进制整数转换为以三为底的整数。他们还展示了如何将最重要的数字放在左边而不是右边。
t = de2bi(12,[],3) % Convert 12 to base 3.
tleft = de2bi(12,[],3,'left-msb') % Significant digit on left
The output is
t =
0 1 1
tleft =
1 1 0
您只需要使用以下'left-msb'
选项de2bi
:
>>de2bi(234, 'left-msb')
ans =
1 1 1 0 1 0 1 0
您可以使用一个更简单的命令dec2bin
来产生所需的结果:
>> dec2bin(234)
ans =
11101010
这是文档:http ://www.mathworks.com/help/matlab/ref/dec2bin.html?refresh=true
虽然这是一个老问题,但我需要对 CRC 校验和做同样的事情,并且觉得我应该分享结果。
就我而言,我需要反转 16 位数字,因此,我尝试了三种方法:
1)根据fliplr()
建议使用反转:
uint16(bin2dec(fliplr(dec2bin(data,16))))
为了测试速度,我决定尝试校验 12MB 的数据。在我的 CRC 中使用上面的代码,需要2000秒才能完成!大部分时间都在执行位反转。
2)然后我设计了一个更优化的解决方案,虽然不是一行代码,但它针对速度进行了优化:
reverse = uint16(0);
for i=1:16
reverse = bitor(bitshift(reverse,1), uint16(bitand(forward,1)));
forward = bitshift(forward,-1);
end
使用相同的 CRC 代码,但使用它而不是 (1),它需要500 多秒才能完成,因此它已经使 CRC 计算快了四倍!
3)这仍然是我喜欢的太多时间,所以我将所有内容都移到了 mex 函数中。这允许使用来自浮动的位旋转示例的代码以获得最佳性能。我将整个 CRC 代码移至 mex 函数,并使用以下两个其他函数进行位反转。
unsigned char crcBitReverse8(unsigned char forward) {
return (unsigned char)(((forward * 0x0802LU & 0x22110LU) | (forward * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16);
}
unsigned short crcBitReverse16(unsigned short forward) {
unsigned char inByte0 = (forward & 0xFF);
unsigned char inByte1 = (forward & 0xFF00) >> 8;
return (unsigned short )((crcBitReverse8(inByte0) << 8) | (crcBitReverse8(inByte1)));
}
只是为了比较,计算相同的 12MB 数据块的 CRC 只需要0.14秒(计算中没有错误,所有三种方法的 CRC 校验和都符合预期)。
因此,基本上,如果您必须多次执行此操作(例如对于 CRC),我强烈建议您编写一个 mex 函数来进行反转。对于这么简单的操作,原生 MATLAB 代码慢的尴尬。
为什么不使用bitget
?
>> bitget( 234, 8:-1:1 )
ans =
1 1 1 0 1 0 1 0