C обратный двоичный код [дубликат]


Возможный дубликат:
C обратные биты в целочисленном беззнаковом

Как я могу обратить двоичное число только с помощью двоичных операторов?

Например:

11100000 -> 00000111
00110100 -> 00101100
00111111 -> 11111100
3 3

3 ответа:

Для такого рода вещей я рекомендую вам взглянуть на удивительную страницу бит Twiddling Hacks.

Вот только один пример решения, взятого с этой страницы:

Реверсируйте биты в байте с помощью 3 операций (64-битное умножение и деление по модулю)

unsigned char b; // reverse this (8-bit) byte 
b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

И, как указано в комментариях, вот еще один вариант:

Реверсирование N-разрядной величины параллельно в 5 * lg(N) операциях

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

// swap odd and even bits
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
// swap consecutive pairs
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// swap nibbles ... 
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// swap bytes
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// swap 2-byte long pairs
v = ( v >> 16             ) | ( v               << 16);

Взгляните набитные твид-хаки . Есть целый раздел о реверсировании битовых последовательностей.

Вы можете посмотреть этот сайт http://graphics.stanford.edu/~seander/bithacks.html

Реверсивные битовые последовательности
Обратные биты очевидным образом
Обратные биты в word по таблице подстановки
Реверсирование битов в байт с помощью 3 операций (64-битное умножение и деление по модулю)
Реверсирование битов в байт с помощью 4 операций (64-битное умножение, без деления)
Реверсируйте биты в байте с помощью 7 операций (нет 64-разрядных, только 32)
Реверсировать N-разрядное количество параллельно с 5 * операции lg (N)