2014-09-28 2 views
2

Я пытаюсь получает бинарное значение числа, напримерЕсть ли способ, чтобы изменить порядок битов в MATLAB

de2bi(234) 

Что приводит меня в том, этот ответ:

0  1  0  1  0  1  1  1 

прямо сейчас что я хочу, что это его обратный порядок без изменения его значения, как это:

11101010 

я попробовалФункция, но у меня нет желаемого ответа. любая помощь и предложения будут оценены.

ответ

3

Пример:

>>de2bi(234) 

ans = 0  1  0  1  0  1  1  1 

>> fliplr(ans) 

ans = 

    1  1  1  0  1  0  1  0 

Используйте функцию fliplr. Его можно использовать для изменения порядка массива.

+0

спасибо, это работает (Y) –

3

Попробуйте использовать флаг 'left-msb' (согласно документации в http://www.mathworks.com/help/comm/ref/de2bi.html)

Команду ниже, показывает, как преобразовать десятичное целое основывать три без указания количества столбцов в матрице выходов. Они также показывают, как разместить наиболее значительную цифру слева, а не справа.

t = de2bi(12,[],3) % Convert 12 to base 3. 

tleft = de2bi(12,[],3,'left-msb') % Significant digit on left 
The output is 

t = 

    0  1  1 


tleft = 

    1  1  0 
+0

это очень полезно для меня :) хорошо мне нужна эта функция слишком поздно в моем назначении :) но FLIPR что-то мне нужно :) спасибо за help man :) –

1

Вы можете использовать более простую команду под названием dec2bin, которая производит желаемый результат:

>> dec2bin(234) 

ans = 

11101010 

Вот Документах: http://www.mathworks.com/help/matlab/ref/dec2bin.html?refresh=true

+0

ну он не дает желаемых результатов. Любые, как спасибо за помощь :) –

+0

@AqeelAbbas 'dec2bin (234)' выводит строку. Используйте 'dec2bin (234) - '0'', если вы хотите получить результат в числовой форме –

2

Вам просто нужно использовать опцию 'left-msb' в de2bi:

>>de2bi(234, 'left-msb') 
ans = 
    1  1  1  0  1  0  1  0 
1

Хотя это старый вопрос, мне нужно было сделать то же самое для контрольной суммы CRC и почувствовать, что я должен поделиться результатами.

В моем случае мне нужно обратить номера 16bit, поэтому, я попробовал три метода:

1) Использование fliplr() отменить в соответствии с предложениями:

uint16(bin2dec(fliplr(dec2bin(data,16)))) 

Чтобы проверить скорость Я решил попробовать и контрольную сумму 12 МБ данных. Используя приведенный выше код в моем CRC, потребовалось секунд для завершения! Большую часть этого времени выполнял разворот бит.

2) Затем я разработал более оптимальное решение, хотя и не одна строка кода он оптимизирован для скорости:

reverse = uint16(0); 
for i=1:16 
    reverse = bitor(bitshift(reverse,1), uint16(bitand(forward,1))); 
    forward = bitshift(forward,-1); 
end 

Используя тот же код CRC, но при этом используют вместо (1), его заняло чуть более секунд, чтобы завершить, так что он делает расчеты CRC в четыре раза быстрее!

3) Это все еще слишком много времени для меня, поэтому вместо этого я переместил все в функцию mex.Это позволяет использовать код из приведенных примеров бит, которые плавают вокруг для оптимальной производительности. Я переместил весь код CRC в функцию mex и использовал следующие две другие функции для разворота бит.

unsigned char crcBitReverse8(unsigned char forward) { 
    return (unsigned char)(((forward * 0x0802LU & 0x22110LU) | (forward * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16); 
} 
unsigned short crcBitReverse16(unsigned short forward) { 
    unsigned char inByte0 = (forward & 0xFF); 
    unsigned char inByte1 = (forward & 0xFF00) >> 8; 
    return (unsigned short)((crcBitReverse8(inByte0) << 8) | (crcBitReverse8(inByte1))); 
} 

Для сравнения, потребовалось всего 0,14 секунд, чтобы вычислить CRC для фрагмента данных же 12MB (и нет никакой ошибки в расчетах, контрольные суммы CRC для всех трех методов соответствует тому, что, как ожидается) ,


Так в основном, если вы должны сделать это много раз (например, для CRC) Я серьезно предлагаю вам написать функцию Mex для делать разворот. Для такой простой операции собственный код MATLAB смущает медленно.

0

Почему бы не использовать bitget?

>> bitget(234, 8:-1:1) 

ans = 

1  1  1  0  1  0  1  0 
Смежные вопросы