【问题标题】:How to convert list of binary values to int32 type?如何将二进制值列表转换为 int32 类型?
【发布时间】:2019-03-06 16:17:45
【问题描述】:

我在 MATLAB 工作区中有一个 little-endian 格式的二进制数列表,我想将它们转换为 int32。 a 是一个由 0 和 1 组成的双向量,如下所示:

a = [0 0 0 1 1 0 0 1   1 1 1 0 1 0 1 0   0 0 0 1 1 0 0 0   1 1 1 1 1 0 0 0];

int32(a) 给了我一个包含 32 个二进制值的行向量,而无需将其转换为 32 位整数。

【问题讨论】:

  • a 是逻辑向量还是字符向量?
  • 它是一个双向量,我从一个文件中读取它作为 fread(f,'ubit1')。 p.s 我没有使用“int32”,因为我正在通过位模式删除文件的某些部分。
  • 也可以直接计算数字,例如通过定义一次二进制权重的向量,然后将其乘以向量。但是,如果向量在例如2的补码,可以按定义扩展
  • mantanj 提出了一个很好的观点。我们应该如何解释format(一个补码,二进制补码,偏移二进制)?
  • 字节顺序是这样的。 [2...1][4...3][6...5][8...7]。 8 是最高有效位,1 是最低有效位。 [ ] 是一个字节,而 ... 表示该字节中的 6 个其他位。如果 8 为 0,则该数字为正数,如果 1 为负数。感谢您的建议,我将创建一个带有权重的向量并将其相乘。

标签: matlab binary type-conversion int32


【解决方案1】:

solutions from this related question(专用于无符号整数)可以修改为处理有符号整数。最简单的方法是将那里的输出转换为uint32,然后使用typecast 转换为int32。建立在this solution:

>> a = [0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0];
>> b = typecast(uint32(sum(pow2(find(a)-1))), 'int32')

b =

  int32

   521688984

如果您知道用于位模式的specific representation(我的猜测是two's complement),您可以通过在计算中直接考虑符号位和complement 来避免使用typecast

如果 a 是 N×32 矩阵,您可以简单地将 sum(...) 替换为链接解决方案中的矢量化计算:

b = typecast(uint32(a*(2.^(0:size(a, 2)-1)).'), 'int32');

【讨论】:

  • 谢谢它有效。如何将其应用于矩阵的每一行,例如 n x 32 矩阵?
猜你喜欢
  • 1970-01-01
  • 2021-07-12
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2023-02-03
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多