2009-10-12 2 views
4

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

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

Бит 1 является самым значительным битом, бит 12 является младшим значащим разрядом.

ответ

9

Функция 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 

Update: Вы можете быть в состоянии сжать даже немного больше скорости из 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.

+0

Это похоже на функцию ** bin2dec **, за исключением использования ** pow2 **, в дополнение к удалению пробелов из строки и преобразованию ее в число с помощью 's-'0'' – Amro

1

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

Try:

binvec2dec(A) 

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

ans = 
    774 

Если MSB остается самым большим, сначала используйте fliplr(A).

3

Ответ на вопрос 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!