реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
Romanello
сообщение Jul 1 2008, 11:06
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 10-03-05
Пользователь №: 3 204



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

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

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

как это сделать наиболее грамотнее?
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Jul 1 2008, 11:20
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



Цитата(Romanello @ Jul 1 2008, 14:06) *
В АРМе на СИ нужно переделать байт :

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

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

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


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


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
Romanello
сообщение Jul 1 2008, 11:23
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 10-03-05
Пользователь №: 3 204



Цитата(АДИКМ @ Jul 1 2008, 15:20) *
проще (и главное быстрее) это делается с помощью таблицы.
думаю 256 байт флеша найдете...



С таблицей это первое что пришло мне в голову, но мне кажется это совсем уж прямолинейно, может есть какие то способы с прокруткой, в 51-х было проще крутнул восемь раз и все ок, а здесь так не получится.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 1 2008, 11:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений.
Код
    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 можно ещё упростить немного.
Go to the top of the page
 
+Quote Post
meister
сообщение Jul 1 2008, 11:44
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(Romanello @ Jul 1 2008, 15:06) *
В АРМе на СИ нужно переделать байт :

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

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

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


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

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

из комментарев к правилам вытекало "пока необходимость оптимизации не будет доказана профайлером". Я бы сначала сделал как привел Alex03, если бы было плохо - как АДИКМ.
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Jul 1 2008, 11:47
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



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


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
Romanello
сообщение Jul 1 2008, 11:51
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 10-03-05
Пользователь №: 3 204



Цитата(Alex03 @ Jul 1 2008, 15:29) *
Не знаю насколько оптимально на АРМ и для байтика, но на С и без циклов/ветвлений.
Код
    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 можно ещё упростить немного.



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

Цитата(АДИКМ @ Jul 1 2008, 15:47) *
если хочется экзотики - порты перехлестните.



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

В принципе предложено два варианта реализующих задачу максимально эффективно, поэтому думаю что дискуссию можно окончить.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 1 2008, 12:00
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Romanello @ Jul 1 2008, 17:50) *
круто все работает. Спасибо.
Порты и так пришлось перевернуть, т.к. разводка по другому не получалась, теперь приходится думать как лучше управлять перевернутыми портами.

Если ещё вот так сделать:
Код
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 лишняя.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 1 2008, 12:06
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 1 2008, 12:33
Сообщение #10


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 1 2008, 12:59
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Rst7 @ Jul 1 2008, 18:33) *
Это еще не самое крутое wink.gif Круто - это таким способом поворот матрицы 8*8 бит (именно бит!) на 90 градусов, причем еще и штуки четыре (матрицы, конечно) за раз - они как раз в восемь 32хбитных регистра лезут.
Это куда такое применяется?
PS. вроде бы 8*8 бит влазит в два 32-х разрядных регистра

Сообщение отредактировал GetSmart - Jul 1 2008, 13:00


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 1 2008, 13:16
Сообщение #12


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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

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


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ljerry
сообщение Jul 1 2008, 13:31
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 7-02-06
Из: Зеленоград
Пользователь №: 14 071



Цитата(MrYuran @ Jul 1 2008, 16:06) *
Круто. Реально круто. Где бы такого нахвататься можно?


Рекомендую хорошую книжку "Алгоритмические трюки для программистов", там подобных фокусов много
Go to the top of the page
 
+Quote Post
blackfin
сообщение Jul 1 2008, 13:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Rst7 @ Jul 1 2008, 17:16) *
Ну правильно, а 4 раза по 8*8 - в восемь регистров.
Или одна ПЛИС.. smile.gif
Go to the top of the page
 
+Quote Post
Axel
сообщение Jul 1 2008, 14:02
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Посмотрите: http://www.cs.utk.edu/~vose/c-stuff/bithac...CopyIntegerSign
Там такого дофига...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 09:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016