2014-09-28 44 views
2

我试图在获取大量如有什么办法来扭转位的顺序MATLAB

de2bi(234) 

导致我有这个答案的二进制值:现在

0  1  0  1  0  1  1  1 

我想要的是它的反向顺序而不改变它的值,如下所示:

11101010 

我试过bitrevorder()功能,但我没有我想要的答案。任何帮助和建议将不胜感激。

回答

3

实施例:

>>de2bi(234) 

ans = 0  1  0  1  0  1  1  1 

>> fliplr(ans) 

ans = 

    1  1  1  0  1  0  1  0 

使用函数fliplr。它可以用来颠倒数组的顺序。

+0

谢谢你的男人,它的工作原理(Y) – 2014-09-28 17:51:37

3

尝试使用标志'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 
+0

这是非常有用的我:) 以及我需要这个功能太后来在我的任务:) 但FLIPR事情我需要:) 感谢帮助男人:) – 2014-09-28 17:43:56

1

您可以使用更简单的命令调用dec2bin产生期望的结果:

>> dec2bin(234) 

ans = 

11101010 

下面是文档:http://www.mathworks.com/help/matlab/ref/dec2bin.html?refresh=true

+0

以及它没有产生预期的结果。任何如何感谢帮助:) – 2014-09-28 17:52:14

+0

@AqeelAbbas'dec2bin(234)'输出一个字符串。如果要以数字形式输出结果,请使用'dec2bin(234) - '0' – 2014-09-28 20:29:55

2

你只需要使用'left-msb'选项de2bi

>>de2bi(234, 'left-msb') 
ans = 
    1  1  1  0  1  0  1  0 
1

虽然这是一个老问题,但我需要为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代码很尴尬缓慢。

0

为什么不使用bitget

>> bitget(234, 8:-1:1) 

ans = 

1  1  1  0  1  0  1  0 
相关问题