обратные биты в байте ansi C

У меня есть функция, которая переворачивает биты в байте, но я не понимаю синтаксис. Почему используются 0x0802U и 0x22110U и другие бинарные операции (что это за числа)

unsigned char reverse(unsigned char B)
{
return (unsigned char)(((b * 0x0802U & 0x22110U) | (b * 0x8020U & 0x88440U)) * 0x10101U >> 16);
}

person rzv    schedule 11.03.2014    source источник
comment
stackoverflow.com/questions/18010695/c-bit-reversal-logic   -  person phuclv    schedule 12.03.2014
comment
Возможный дубликат Лучший алгоритм для Инверсия битов (от MSB->LSB к LSB->MSB) в C   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 24.06.2016


Ответы (2)


Проверьте страницу «Bit Twiddling Hacks» для объяснения:

Поменять местами биты в байте с помощью 7 операций (не для 64-разрядных) http://graphics.stanford.edu/~seander/bithacks.html

person ouah    schedule 11.03.2014
comment
Вы должны скопировать соответствующий раздел здесь, чтобы сделать ответ автономным. - person paxdiablo; 12.03.2014
comment
@paxdiablo в идеале да, я должен, но мне также нужно будет вставить два предыдущих раздела из ссылки, которая не соответствует максимальной длине строки stackoverflow. - person ouah; 12.03.2014
comment
до сих пор не нахожу объяснения - person rzv; 12.03.2014
comment
дело в том, что эта страница (кстати, абсолютная ссылка) на самом деле не объясняет версию с 7 операциями, а только 64-битную версию с 3 операциями... - person fvu; 12.03.2014

Прямая ссылка на правильный раздел о том, как работать с битами.

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

                                         abcd efgh
    *                          0000 1000 0000 0010
    ----------------------------------------------
                          0abc defg h00a bcde fgh0
    &                     0010 0010 0001 0001 0000
    ----------------------------------------------
                          00b0 00f0 000a 000e 0000


                                         abcd efgh
    *                          1000 0000 0010 0000
    ----------------------------------------------
                     0abc defg h00a bcde fgh0 0000
    &                0000 1000 1000 0100 0100 0000
    ----------------------------------------------
                     0000 d000 h000 0c00 0g00 0000


                          00b0 00f0 000a 000e 0000
    |                0000 d000 h000 0c00 0g00 0000
    ----------------------------------------------
                          d0b0 h0f0 0c0a 0g0e 0000
    *                     0001 0000 0001 0000 0001
    ----------------------------------------------
      d0b0 h0f0 dcba hgfe dcba hgfe 0c0a 0g0e 0000
    >> and convert to 8-bits
    ----------------------------------------------
                                         hgfe dcba
person JonS    schedule 12.03.2014