Вот не рекомендуемое решение, просто для удовольствия. Я проверил несколько конверсий, но не все. Определенно, поиск таблиц - это именно то, что нужно, и принятый ответ на поворот и перенос - это то, что я использовал в прошлом.
В приведенном ниже решении используется умножение, чтобы разделить младшие 4 бита на старшие биты, а затем модуль 2 ** n-1 для свертывания битов обратно.
Вот версия за один шаг, но использует 64-битное умножение:
http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
#include <stdlib.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
int x, y;
for (x=0; x<256; x++)
{
// magic number / bit distribution way of flipping 4 bits
// y = ((x * 0x00082082 & 0x01122408) % 255) >> 2;
_asm
{
mov ecx, x // get operand
mov eax, ecx // get lower 4 bits into eax
and eax, 0x0f
mov ebx, 0x82082 // get magic multiplier into ebx
imul eax, ebx // distribute lower into upper bits
and eax, 0x1122408 // and out the bits we want
mov edx, 0 // initilialize upper DX:AX bits
mov edi, 0xff // modulo divisor
idiv edi // divide, leaving remainder in DX
shr edx, 2 // adjust result
mov esi, edx // stash first half of flipped bits
shl esi, 4
// repeat with upper bits
mov eax, ecx
shr eax, 4
imul eax, ebx
and eax, 0x1122408
mov edx, 0
idiv edi
shr edx, 2
or edx, esi
mov y, edx
};
printf("x %08x reverse %08x\n", x, y);
}
return 0;
}