Как я могу преобразовать двоичный файл в десятичную без использования цикла? - PullRequest
4 голосов
/ 12 октября 2009

У меня есть 12-разрядный двоичный файл, который мне нужно преобразовать в десятичную. Например:

A = [0,1,1,0,0,0,0,0,1,1,0,0];

Бит 1 - самый старший бит, Бит 12 - младший бит.

Ответы [ 3 ]

10 голосов
/ 12 октября 2009

Примечание: Этот ответ в основном относится к неподписанным типам данных. Для преобразования в подписанные типы необходимы несколько дополнительных шагов, обсуждаемых здесь .


Функция 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. Результирующий вектор затем суммируется, чтобы получить целое число, представленное двоичным шаблоном нулей и единиц, причем первый элемент в массиве считается самым старшим битом. Если вы хотите, чтобы первый элемент считался младшим значащим битом, вы можете сделать следующее:

>> 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.

4 голосов
/ 12 октября 2009

Доминик ответ предполагает, что у вас есть доступ к Набор инструментов сбора данных . Если не используется 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!

2 голосов
/ 12 октября 2009

Если MSB самый правый (я не уверен, что вы имеете в виду под битом 1, извините, если это кажется глупым):

Попытка:

binvec2dec(A)

Вывод должен быть:

 ans =
   774

Если MSB находится слева, сначала введите fliplr(A).

...