我有一个12位二进制,我需要转换为十进制。 例如:
A = [0,1,1,0,0,0,0,0,1,1,0,0];
第1位是最显著位,第12位是最显著位。
我有一个12位二进制,我需要转换为十进制。 例如:
A = [0,1,1,0,0,0,0,0,1,1,0,0];
第1位是最显著位,第12位是最显著位。
注意:这个答案主要适用于无符号的数据类型。 对于转换为符号类型,一些额外的步骤是必要的,讨论在这里 。
该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)-1
至0
。 然后将所得的矢量相加,得到由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
。
多米尼克的回答假设你有机会到数据采集工具箱 。 如果不使用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!
如果MSB是最右边的(我不知道你所说的第1位的意思,对不起,如果这似乎愚蠢的):
尝试:
binvec2dec(A)
输出应该是:
ans =
774
如果MSB是最左边,使用fliplr(A)
第一。