如何在不使用循环的情况下将二进制转换为十进制?

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)-10。然后将得到的向量相加,得到由 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)

【讨论】:

以上是关于如何在不使用循环的情况下将二进制转换为十进制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用不安全代码的情况下将float转换为二进制?

C 代码中的一个小错误,用于在不使用 * 运算符的情况下将 2 位二进制数相乘

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件

如何在 Ruby 中将字符串或整数转换为二进制?

如何在 Ruby 中将字符串或整数转换为二进制?