Хотя это старый вопрос, мне нужно было сделать то же самое для контрольной суммы 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 смущает медленно.
спасибо, это работает (Y) –