Перейти к содержанию
    

Подскажите как лучше всего перевернуть байт

В АРМе на СИ нужно переделать байт :

 

было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0

 

нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7

 

как это сделать наиболее грамотнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В АРМе на СИ нужно переделать байт :

 

было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0

 

нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7

 

как это сделать наиболее грамотнее?

 

проще (и главное быстрее) это делается с помощью таблицы.

думаю 256 байт флеша найдете...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проще (и главное быстрее) это делается с помощью таблицы.

думаю 256 байт флеша найдете...

 

 

С таблицей это первое что пришло мне в голову, но мне кажется это совсем уж прямолинейно, может есть какие то способы с прокруткой, в 51-х было проще крутнул восемь раз и все ок, а здесь так не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений.

    unsigned char c;

    c = ((c>>1) & 0x55) | ((c<<1) & 0xAA);
    c = ((c>>2) & 0x33) | ((c<<2) & 0xCC);
    c = ((c>>4) & 0x0F) | ((c<<4) & 0xF0);

Для 32-х разрядов добавляется ещё 2 строчки.

 

PS можно ещё упростить немного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В АРМе на СИ нужно переделать байт :

 

было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0

 

нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7

 

как это сделать наиболее грамотнее?

 

Саттер в своей книге приводил два правила оптимизации:

 

1. Не оптимизируй.

2. Никогда не оптмизируй.

 

из комментарев к правилам вытекало "пока необходимость оптимизации не будет доказана профайлером". Я бы сначала сделал как привел Alex03, если бы было плохо - как АДИКМ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений.

    unsigned char c;

    c = ((c>>1) & 0x55) | ((c<<1) & 0xAA);
    c = ((c>>2) & 0x33) | ((c<<2) & 0xCC);
    c = ((c>>4) & 0x0F) | ((c<<4) & 0xF0);

Для 32-х разрядов добавляется ещё 2 строчки.

 

PS можно ещё упростить немного.

 

 

круто все работает. Спасибо.

 

если хочется экзотики - порты перехлестните.

 

 

Порты и так пришлось перевернуть, т.к. разводка по другому не получалась, теперь приходится думать как лучше управлять перевернутыми портами.

 

В принципе предложено два варианта реализующих задачу максимально эффективно, поэтому думаю что дискуссию можно окончить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

круто все работает. Спасибо.

Порты и так пришлось перевернуть, т.к. разводка по другому не получалась, теперь приходится думать как лучше управлять перевернутыми портами.

Если ещё вот так сделать:

unsigned char bitrev8(unsigned char c)
{
    c = ((c>>1) & 0x55) | ((c & 0x55)<<1);
    c = ((c>>2) & 0x33) | ((c & 0x33)<<2);
    c = (c>>4) | (c<<4);
    return c;
}

то GCC с -O3 генерит:

 <bitrev8>:
       E1A030A0   mov r3, r0, lsr #0x01
       E2033055   and r3, r3, #0x00000055
       E2000055   and r0, r0, #0x00000055
       E1833080   orr r3, r3, r0, lsl #0x01
       E1A02123   mov r2, r3, lsr #0x02
       E2022033   and r2, r2, #0x00000033
       E2033033   and r3, r3, #0x00000033
       E1822103   orr r2, r2, r3, lsl #0x02
       E1A00222   mov r0, r2, lsr #0x04
       E1800202   orr r0, r0, r2, lsl #0x04
       E20000FF   and r0, r0, #0x000000ff
       E12FFF1E   bx lr

И то строчка and r0, r0, #0x000000ff лишняя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Круто. Реально круто. Где бы такого нахвататься можно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Круто. Реально круто. Где бы такого нахвататься можно?

 

Это еще не самое крутое ;) Круто - это таким способом поворот матрицы 8*8 бит (именно бит!) на 90 градусов, причем еще и штуки четыре (матрицы, конечно) за раз - они как раз в восемь 32хбитных регистра лезут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это еще не самое крутое ;) Круто - это таким способом поворот матрицы 8*8 бит (именно бит!) на 90 градусов, причем еще и штуки четыре (матрицы, конечно) за раз - они как раз в восемь 32хбитных регистра лезут.
Это куда такое применяется?

PS. вроде бы 8*8 бит влазит в два 32-х разрядных регистра

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это куда такое применяется?

 

Для преобразования изображения в виде байт на точку к битовым плоскостям. Для ширпотреба не актуально :)

 

PS. вроде бы 8*8 бит влазит в два 32-х разрядных регистра

 

Ну правильно, а 4 раза по 8*8 - в восемь регистров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Круто. Реально круто. Где бы такого нахвататься можно?

 

Рекомендую хорошую книжку "Алгоритмические трюки для программистов", там подобных фокусов много

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...