如何在不使用循环的情况下将二进制转换为十进制?
Posted
技术标签:
【中文标题】如何在不使用循环的情况下将二进制转换为十进制?【英文标题】:How can I convert a binary to a decimal without using a loop? 【发布时间】:2010-12-05 21:28:54 【问题描述】:我有一个需要转换为十进制的 12 位二进制文件。例如:
A = [0,1,1,0,0,0,0,0,1,1,0,0];
第 1 位是最高有效位,第 12 位是最低有效位。
【问题讨论】:
相关:How to convert list of binary values to int32 type? 【参考方案1】:注意:此答案主要适用于无符号数据类型。为了转换为有符号类型,需要一些额外的步骤,讨论here。
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
更新:您可以通过使用 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 函数,除了使用 pow2 之外,除了从字符串中删除空格并使用 @987654339 将其转换为数字@【参考方案2】:Dominic 的回答假设您有权访问数据采集工具箱。如果不使用 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 位!
【讨论】:
【参考方案3】:如果 MSB 是最正确的(我不确定您所说的第 1 位是什么意思,抱歉,如果这看起来很愚蠢):
试试:
binvec2dec(A)
输出应该是:
ans =
774
如果 MSB 在最左边,请先使用fliplr(A)
。
【讨论】:
以上是关于如何在不使用循环的情况下将二进制转换为十进制?的主要内容,如果未能解决你的问题,请参考以下文章
C 代码中的一个小错误,用于在不使用 * 运算符的情况下将 2 位二进制数相乘
如何在不先加载到 RAM 的情况下将文件加载到 blob 中?