【问题标题】:Faster way for decimal to binary conversion十进制到二进制转换的更快方法
【发布时间】:2016-12-19 19:23:06
【问题描述】:

考虑一个整数数组:

X = [1, 3, 3, 3,2,3 ,1,1,2,3]

我想将每个数字转换为其 4 位二进制等效值。我做了以下,但结果不正确。似乎 MSB 和 LSB 颠倒了。我尝试将 MATLAB 的函数与 decimal_to_bin =dec2bin(X) 一起使用,但即使这个输出也是错误的。

我该如何解决这个问题?

X = [1, 3, 3, 3,2,3 ,1,1,2,3];
b = 4;
lookup_table = generate_lookupTable(b);
BinaryX = lookup_table(X,:);



function result = generate_lookupTable(b)

% generate binary code

k = 2^b;
result = zeros(k,b);

for i=1:k
    for j=1:b
        result(i,j) = bitand(uint8(2^(j-1)),uint8(i-1))/uint8(2^(j-1));
    end
end

end

我得到的输出是BinaryX

0   0   0   0
0   1   0   0
0   1   0   0
0   1   0   0
1   0   0   0
0   1   0   0
0   0   0   0
0   0   0   0
1   0   0   0
0   1   0   0

【问题讨论】:

  • 如果您查看dec2bin 的文档,您会发现它需要两个参数。如果您将其称为dec2bin(X, 4),则应该会产生所需的结果。
  • 您发布的代码无法运行,因此如果您需要帮助使其正常工作,您必须对其进行一些改进
  • @beak:我正在尝试实现查找表,代码旨在生成查找表。但是,查表返回的答案是错误的
  • @Trogdor:我已经修复了代码,它现在应该可以运行了。感谢指出错误
  • 那么,正如@Trogdor 所说,为什么不使用dec2bin 创建查找表呢?

标签: matlab binary-data


【解决方案1】:

我认为烧杯的含义大致如下:

% Your vector
X = [1, 3, 3, 3,2,3 ,1,1,2,3];

% number of bits to use 
numbits = 4;

% Create lookup table
little_endian = true;

LUT = dec2bin(0:15, numbits) == '1';
if ~little_endian
    LUT = fliplr(LUT); end

% The conversion 
bits = LUT(X(:) + 1, :)

或者,您可以做dec2bin 所做的事情,但不必大惊小怪:

bits = (rem(floor(X(:)*pow2(1-numbits:0)),2) == 1);

【讨论】:

  • dec2bin 生成一个 char 数组,因此 LUT = LUT - '0' 可能是必要的。或者,如果 OP 有通信工具箱,他们可以使用 de2bi 给出数值(注意字节序)。
  • @beaker 即使这是真的,我仍然更喜欢只使用内置的 MATLAB 函数来回答——并不是每个来到这里的谷歌人都会有那个工具箱。另外,我故意转换为logical 而不是char,因为这样更有意义:) OP 还在uint8 中发布了一个表格,而不是char,所以我选择了logical,因为它是数字并且具有01 的额外好处,而不是255A 或类似的愚蠢。
  • 抱歉,我看不到您将dec2bin 的结果转换为逻辑的位置。我同意de2bi,这只是一种选择。
  • 1 需要用引号括起来:LUT = dec2bin(0:15, numbits) == '1'; 这使它成为一个出色的解决方案
  • @RodyOldenhuis,np,现在错别字已修复,这是一个很好的解决方案:)
猜你喜欢
  • 2012-12-22
  • 2010-12-13
  • 2014-04-29
  • 2014-04-17
  • 2019-01-27
  • 2012-06-12
  • 2023-04-11
  • 2021-07-29
  • 2016-02-09
相关资源
最近更新 更多