有没有办法在matlab中反转位的顺序

时间:2014-09-28 17:34:15

标签: matlab bit-representation

我正在尝试获取数字的二进制值,例如

de2bi(234)

这导致我得到了这个答案:

 0     1     0     1     0     1     1     1

现在我想要的是它的逆序而不改变它的值:

11101010

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

6 个答案:

答案 0 :(得分:3)

示例:

>>de2bi(234)

ans =  0     1     0     1     0     1     1     1

>> fliplr(ans)

ans =

     1     1     1     0     1     0     1     0

使用功能fliplr。它可以用来反转数组的顺序。

答案 1 :(得分: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

答案 2 :(得分:2)

您只需使用'left-msb'中的de2bi选项:

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

答案 3 :(得分:1)

您可以使用名为dec2bin的更简单的命令来生成所需的结果:

>> dec2bin(234)

ans =

11101010

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

答案 4 :(得分:1)

虽然这是一个老问题,但我需要为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)));
}

为了进行比较,只需 0.14 秒来计算相同12MB数据块的CRC(并且计算中没有错误,所有三种方法的CRC校验和都符合预期)。

所以基本上,如果你必须多次这样做(例如对于CRC),我认真建议你写一个mex函数进行反转。对于这样一个简单的操作,本机MATLAB代码令人尴尬。

答案 5 :(得分:0)

为什么不使用bitget

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

ans =

 1     1     1     0     1     0     1     0