我试图在获取大量如有什么办法来扭转位的顺序MATLAB
de2bi(234)
导致我有这个答案的二进制值:现在
0 1 0 1 0 1 1 1
我想要的是它的反向顺序而不改变它的值,如下所示:
11101010
我试过bitrevorder()
功能,但我没有我想要的答案。任何帮助和建议将不胜感激。
我试图在获取大量如有什么办法来扭转位的顺序MATLAB
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)
的命令下面示出了如何为十进制整数,而无需指定所述输出矩阵中的列数到基座3的转换。他们还展示了如何将最重要的数字放在左边而不是右边。
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
这是非常有用的我:) 以及我需要这个功能太后来在我的任务:) 但FLIPR事情我需要:) 感谢帮助男人:) – 2014-09-28 17:43:56
您可以使用更简单的命令调用dec2bin
产生期望的结果:
>> dec2bin(234)
ans =
11101010
下面是文档:http://www.mathworks.com/help/matlab/ref/dec2bin.html?refresh=true
以及它没有产生预期的结果。任何如何感谢帮助:) – 2014-09-28 17:52:14
@AqeelAbbas'dec2bin(234)'输出一个字符串。如果要以数字形式输出结果,请使用'dec2bin(234) - '0' – 2014-09-28 20:29:55
你只需要使用'left-msb'
选项de2bi
:
>>de2bi(234, 'left-msb')
ans =
1 1 1 0 1 0 1 0
虽然这是一个老问题,但我需要为CRC校验和做同样的事情,并感觉我应该分享结果。
对我来说,我需要扭转16位的数字,所以,我已经试过三种方法:
1)使用fliplr()
扭转按照建议:
uint16(bin2dec(fliplr(dec2bin(data,16))))
为了测试速度我决定尝试和校验12MB的数据。在我的CRC中使用上面的代码,它完成了秒!这时大部分时间都在执行位反转。
2)I然后设计了一个更理想的解决方案,但不是一个线路码被优化速度:
reverse = uint16(0);
for i=1:16
reverse = bitor(bitshift(reverse,1), uint16(bitand(forward,1)));
forward = bitshift(forward,-1);
end
使用相同的CRC码,但是与此代替(1),它花了一点点时间完成了秒,所以它已经使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)));
}
只是为了比较,仅仅用了0.14秒来计算CRC的一样12MB数据块(并没有在计算没有错误,CRC校验所有三种方法相匹配的期望是什么) 。所以基本上,如果你必须这么做很多次(例如CRC),我认真地建议你写一个mex函数来做逆转。对于这样一个简单的操作,原生MATLAB代码很尴尬缓慢。
为什么不使用bitget
?
>> bitget(234, 8:-1:1)
ans =
1 1 1 0 1 0 1 0
谢谢你的男人,它的工作原理(Y) – 2014-09-28 17:51:37