Вот алгоритм. Можно упростить для байта (частный случай).
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 27 июля 2004 г. 14:51
В ответ на: Красиво и эффективно поменять порядок следования бит в байте (0 - 7 на 7 - 0), Си. Какие мысли? отправлено allmaker 27 июля 2004 г. 12:41


Reverse an N-bit quantity in parallel in 7 * lg(N) operations:

unsigned int v; // 32 bit word to reverse bit order

const int S[] = {1, 2, 4, 8, 16}; // Magic Binary Numbers
const int B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};

v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); // swap odd and even bits
v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); // swap consecutive pairs
v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); // swap nibbles ...
v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]);
v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]);

This method is best suited to situations where N is large.

Any reasonable optimizing C compiler should treat the dereferences of B, ~B, and S as constants, requiring no evaluation other than perhaps a load operation for some of the B and ~B references.

See Dr. Dobb's Journal 1983, Edwin Freed's article on Binary Magic Numbers for more information.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru