我怎样才能二进制转换为十进制,而无需使用一个循环?(How can I convert a bina

2019-07-22 04:03发布

我有一个12位二进制,我需要转换为十进制。 例如:

A = [0,1,1,0,0,0,0,0,1,1,0,0];

第1位是最显著位,第12位是最显著位。

Answer 1:

注意:这个答案主要适用于无符号的数据类型。 对于转换为符号类型,一些额外的步骤是必要的,讨论在这里 。


bin2dec函数是一种选择,但需要你的矢量首先更改为字符串。 bin2dec相比,还可计算自己的号码是缓慢的。 下面是更快约75倍的解决方案:

>> A = [0,1,1,0,0,0,0,0,1,1,0,0];
>> B = sum(A.*2.^(numel(A)-1:-1:0))

B =

        1548

为了解释, A相乘逐元素以2的幂的矢量,与指数范围从numel(A)-10 。 然后将所得的矢量相加,得到由0和1的二值图案所表示的整数,与阵列中的第一个元素被认为是最显著位。 如果你想第一个元素被认为是最显著位,你可以做到以下几点:

>> B = sum(A.*2.^(0:numel(A)-1))

B =

        774

更新:您可以通过使用挤压甚至更多一点的速度从MATLAB的find得到的那些的索引(避免逐元素相乘,并潜在地减少所需的指数计算的数量),并使用pow2功能,而不是2.^...

B = sum(pow2(find(flip(A))-1));  % Most significant bit first
B = sum(pow2(find(A)-1));        % Least significant bit first


扩展解决方案矩阵...

如果你有很多,你要转换为整数二元载体,上述方案可以很容易地修改,所有的值转换一个矩阵运算。 假设A是N×12矩阵,其中每行一个二元载体。 以下将它们全部转换为整数值的N×1矢量:

B = A*(2.^(size(A, 2)-1:-1:0)).';  % Most significant bit first
B = A*(2.^(0:size(A, 2)-1)).';     % Least significant bit first

另外请注意,上述所有的解决方案通过查看列的数量自动确定您的矢量位的数量A



Answer 2:

多米尼克的回答假设你有机会到数据采集工具箱 。 如果不使用BIN2DEC:

A = [0,1,1,0,0,0,0,0,1,1,0,0];
bin2dec( sprintf('%d',A) )

或(反向)

A = [0,1,1,0,0,0,0,0,1,1,0,0];
bin2dec( sprintf('%d',A(end:-1:1)) )

这取决于你想要什么是第1位和12!



Answer 3:

如果MSB是最右边的(我不知道你所说的第1位的意思,对不起,如果这似乎愚蠢的):

尝试:

binvec2dec(A)

输出应该是:

 ans =
   774

如果MSB是最左边,使用fliplr(A)第一。



文章来源: How can I convert a binary to a decimal without using a loop?