Romanello 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба В АРМе на СИ нужно переделать байт : было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0 нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7 как это сделать наиболее грамотнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АДИКМ 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба В АРМе на СИ нужно переделать байт : было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0 нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7 как это сделать наиболее грамотнее? проще (и главное быстрее) это делается с помощью таблицы. думаю 256 байт флеша найдете... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romanello 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба проще (и главное быстрее) это делается с помощью таблицы. думаю 256 байт флеша найдете... С таблицей это первое что пришло мне в голову, но мне кажется это совсем уж прямолинейно, может есть какие то способы с прокруткой, в 51-х было проще крутнул восемь раз и все ок, а здесь так не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений. 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 можно ещё упростить немного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба В АРМе на СИ нужно переделать байт : было bit7, bit6. bit5. bit4. bit 3. bit2. bit 1. bit0 нужно bit0, bit1, bit2. bit3. bit4, bit5, bit6, bit7 как это сделать наиболее грамотнее? Саттер в своей книге приводил два правила оптимизации: 1. Не оптимизируй. 2. Никогда не оптмизируй. из комментарев к правилам вытекало "пока необходимость оптимизации не будет доказана профайлером". Я бы сначала сделал как привел Alex03, если бы было плохо - как АДИКМ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АДИКМ 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба если хочется экзотики - порты перехлестните. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romanello 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений. 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 можно ещё упростить немного. круто все работает. Спасибо. если хочется экзотики - порты перехлестните. Порты и так пришлось перевернуть, т.к. разводка по другому не получалась, теперь приходится думать как лучше управлять перевернутыми портами. В принципе предложено два варианта реализующих задачу максимально эффективно, поэтому думаю что дискуссию можно окончить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба круто все работает. Спасибо. Порты и так пришлось перевернуть, т.к. разводка по другому не получалась, теперь приходится думать как лучше управлять перевернутыми портами. Если ещё вот так сделать: 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 лишняя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Круто. Реально круто. Где бы такого нахвататься можно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Круто. Реально круто. Где бы такого нахвататься можно? Это еще не самое крутое ;) Круто - это таким способом поворот матрицы 8*8 бит (именно бит!) на 90 градусов, причем еще и штуки четыре (матрицы, конечно) за раз - они как раз в восемь 32хбитных регистра лезут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 1 июля, 2008 Опубликовано 1 июля, 2008 (изменено) · Жалоба Это еще не самое крутое ;) Круто - это таким способом поворот матрицы 8*8 бит (именно бит!) на 90 градусов, причем еще и штуки четыре (матрицы, конечно) за раз - они как раз в восемь 32хбитных регистра лезут.Это куда такое применяется? PS. вроде бы 8*8 бит влазит в два 32-х разрядных регистра Изменено 1 июля, 2008 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Это куда такое применяется? Для преобразования изображения в виде байт на точку к битовым плоскостям. Для ширпотреба не актуально :) PS. вроде бы 8*8 бит влазит в два 32-х разрядных регистра Ну правильно, а 4 раза по 8*8 - в восемь регистров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ljerry 0 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Круто. Реально круто. Где бы такого нахвататься можно? Рекомендую хорошую книжку "Алгоритмические трюки для программистов", там подобных фокусов много Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 27 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Ну правильно, а 4 раза по 8*8 - в восемь регистров. Или одна ПЛИС.. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 1 июля, 2008 Опубликовано 1 июля, 2008 · Жалоба Посмотрите: http://www.cs.utk.edu/~vose/c-stuff/bithac...CopyIntegerSign Там такого дофига... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться