Как оптимально зеркально отразить биты в байте ?

Тема в разделе "Микроконтроллеры AVR", создана пользователем issaom, 25 фев 2018.

  1. issaom

    issaom Гуру

    Всем доброго! Очередной вопрос от чайника к Гуру языка С. Как оптимально зеркально отразить биты в байте (скопировать(сдвинуть) в другой байт)?
    Например
    B00000001 -> B10000000
    B00000011 -> B11000000
    B00000101 -> B10100000
    т.е. нужно чтобы
    7 bit принял значение 0 bit
    6 bit принял значение 1 bit
    и.т.д. цикл с побитовыми операциями я написать могу сам, может есть фишка более простая?
     
  2. DIYMan

    DIYMan Guest

    Либо я не понял чего-то, либо оператор ~ делает ровно то, что надо:

    Код (C++):
    byte b = 1;
    byte notB = ~b; // все биты поменяли своё значение не противоположное
    https://www.cprogramming.com/tutorial/bitwise_operators.html :
     
  3. issaom

    issaom Гуру

    Код (C++):
    uint8_t mirror(uint8_t b) {
    uint8_t bm;
    bitWrite(bm,7, bitRead(b,0));
    bitWrite(bm,6, bitRead(b,1));
    bitWrite(bm,5, bitRead(b,2));
    bitWrite(bm,4, bitRead(b,3));
    bitWrite(bm,3, bitRead(b,4));
    bitWrite(bm,2, bitRead(b,5));
    bitWrite(bm,1, bitRead(b,6));
    bitWrite(bm,0, bitRead(b,7));
    return bm;
    }
    вот такая штука нужна - может её можно проще написать как то )))
    ~ этот оператор просто инвертирует биты ))))
    вот для этого....
    вопрос.jpg
     
    Последнее редактирование: 26 фев 2018
  4. DIYMan

    DIYMan Guest

    Как вариант (стырено в инетах, идея норм):

    Код (C++):
    unsigned char reverse(unsigned char b) {
       b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
       b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
       b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
       return b;
    }
     
    Andrey12 и issaom нравится это.
  5. DIYMan

    DIYMan Guest

    Идея с lookup-таблицей:
    Код (C++):
    static unsigned char lookup[16] = {
    0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
    0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf, };

    uint8_t reverse(uint8_t n) {
       // Reverse the top and bottom nibble then swap them.
       return (lookup[n&0b1111] << 4) | lookup[n>>4];
    }
    Достаточно? ;)
     
    Andrey12 и issaom нравится это.
  6. ostrov

    ostrov Гуру

    У меня так получилось:
    Код (C++):
    byte inv(byte a) {
      byte b = 0;
      for (byte i = 0; i < 8; i++) {
        b |= bool(a & (1 << (7 - i))) << i;
      }
      return b;
    }
     
    issaom нравится это.
  7. DetSimen

    DetSimen Guest

    почти то же самое, нагляднее
    Код (C++):
    byte ReverseByte(byte inbyte)
    {
        byte result = 0;
        for (byte i = 0; i < 8; i++)
        {
            result <<= 1;
            result |= bool(inbyte & 0x01);
            inbyte >>= 1;
        }
        return result;
    }
     
     
    issaom нравится это.
  8. mcureenab

    mcureenab Гуру

    На ассемблере проще всего будет. В нём есть команды LSR r1 и ROL r2. Загрузив в r1 аргумент, после восьми пар таких сдвигов получим требуемый результат в r2.

    [​IMG]
     
  9. b707

    b707 Гуру

    del
     
    Последнее редактирование: 26 фев 2018
  10. Softer

    Softer Нуб

    Или в Excel ;)
    =ДЕС.В.ШЕСТН(ЕСЛИ(БИТ.И(A1;1)=1;128)+ЕСЛИ(БИТ.И(A1;2)=2;64)+ЕСЛИ(БИТ.И(A1;4)=4;32)+ЕСЛИ(БИТ.И(A1;8)=8;16)+ЕСЛИ(БИТ.И(A1;16)=16;8)+ЕСЛИ(БИТ.И(A1;32)=32;4)+ЕСЛИ(БИТ.И(A1;64)=64;2)+ЕСЛИ(БИТ.И(A1;128)=128;1);2)
    Исходный байт в десятичном виде в ячейке A1
     
  11. Un_ka

    Un_ka Гуру

    А как в excel сослаться на ячейку таблицы по имени столбца и строки? Например, есть таблица с названием ЗП в ней есть ячейка первого столбца с содержанием 1678, нужно обратиться к ячейке в той же строке, зная заголовок столбца и содержание ячейки первого ряда.
     
  12. Andy16

    Andy16 Нерд

    Ты не про функцию ВПР?
     
  13. Softer

    Softer Нуб

    Если эта таблица в excel, то там все ячейки имеют столбцово-строчную адресацию. Зачем этот изврат через пользовательские заголовки столбца? Например, первая ячейка первой строки всегда A1, следующая за ней в этом ряду B1... Вопрос не в текущую тему и не понятен :(
     
  14. parovoZZ

    parovoZZ Гуру

    В excel лучше всё же относительная адресация.
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Каков критерий оптимальности? Объём кода? Количество тактов процессора? Какой, кстати, процессор? Или нужно универсальное (для любого процессора) решение на ЯВУ?
     
  16. issaom

    issaom Гуру

    я код для этой штуки на Arduino закончил писать 4 марта 2018г


    Весь этот Некропостинг тут для кого ? И причем тут Excel ?
    Там использовался готовый набор шрифтов стыренный из какого-то проекта, биты в байтах этого набора шрифтов лежали не в том порядке в котором нужно было выводить на POV дисплей... вроде что-то из того что предложили на форуме и использовал.
     
    Последнее редактирование: 13 авг 2021
    Andrey12 и Un_ka нравится это.
  17. Asper Daffy

    Asper Daffy Иксперд

    Прошу прощения, не заметил дат.
    Не знаю, мне показалось, что Вам интересно
    Но, похоже, ошибся, извините ещё раз.
     
    issaom нравится это.
  18. issaom

    issaom Гуру

    Да я не обижаюсь - просто примеров уже накидали, честно скажу чем воспользовался - даже не помню.....