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

 
 
> поменять местами биты в байте, простой вопрос
Vny4ek
сообщение Apr 25 2010, 19:34
Сообщение #1


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

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Ребят подскажите плиз как реализовать ума не приложу.
принимаю данные с шины и с первого байта приходящего забиваю в буфер
например буфер байт temp[4]={0x72,0x8C,0x23,0x6B};
потом в ходе выполнения программы оказывается нужно еще эти биты использовать но не слева направа формировать из бит байт а справа на лево
например 0х72=01110010b у меня первый байт принятый, а нужно что бы он стал последним, тоесть взять данные и записать их например в другой массив, но использовать биты не слева направо а справа налево тоесть эти биты 0х72=01110010b которые у меня были первыми на самом деле сформировывать должны последний байт и получается 0х9С. Переписывать процедуру приема можно конечно но мне нужно и так и так. Как проще сделать подскажите пожалуста. Пишу на Си для кодвижен
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Apr 26 2010, 07:56
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Для AVR все равно быстрее так
Код
uint8_t rsb(uint8_t a)
{
    a = ((a & 0x55) << 1) | ((a & 0xAA) >> 1);
    a = ((a & 0xCC) >> 2) | ((a & 0x33) << 2);
    return __swap_nibbles(a);
}

15 тактов. Даже если на асм написать развернутый цикл со сдвигом через перенос получится 16 тактов.
Код
5              a = ((a & 0x55) << 1) | ((a & 0xAA) >> 1);
   \   00000000   2F10                       MOV     R17,R16
   \   00000002   7515                       ANDI    R17,0x55
   \   00000004   0F11                       LSL     R17
   \   00000006   7A0A                       ANDI    R16,0xAA
   \   00000008   9506                       LSR     R16
   \   0000000A   2B01                       OR      R16,R17
      6              a = ((a & 0xCC) >> 2) | ((a & 0x33) << 2);
      7              return __swap_nibbles(a);
   \   0000000C   2F10                       MOV     R17,R16
   \   0000000E   7C1C                       ANDI    R17,0xCC
   \   00000010   9516                       LSR     R17
   \   00000012   9516                       LSR     R17
   \   00000014   7303                       ANDI    R16,0x33
   \   00000016   0F00                       LSL     R16
   \   00000018   0F00                       LSL     R16
   \   0000001A   2B01                       OR      R16,R17
   \   0000001C   9502                       SWAP    R16
   \   0000001E   9508                       RET
Go to the top of the page
 
+Quote Post
x736C
сообщение Apr 27 2010, 01:53
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(KRS @ Apr 26 2010, 11:56) *
Для AVR все равно быстрее так
Код
uint8_t rsb(uint8_t a)
{
    a = ((a & 0x55) << 1) | ((a & 0xAA) >> 1);
    a = ((a & 0xCC) >> 2) | ((a & 0x33) << 2);
    return __swap_nibbles(a);
}

15 тактов. Даже если на асм написать развернутый цикл со сдвигом через перенос получится 16 тактов.
Код
...

С первой половиной согласен — 6 тактов, вторая половина могла бы уложиться в 5 без лишних сдвигов.
Итого 11 тактов против 15.
Код
uint8_t rsb(uint8_t a)
{    a = ((a & 0x55) << 1) | ((a & 0xAA) >> 1);
    return __swap_nibbles(a);
    a = ((a & 0x66) | (a & 0x99));        }

mov  r17,r16
lsr  r17
andi r17,0x55
lsr  r16
andi r16,0xAA
or   r16,r17
mov  r17,r16
swap r17
andi r17,0x66
andi r16,0x99
or   r16,r17
(ret)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 27 2010, 20:58
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(x736C @ Apr 27 2010, 05:53) *
С первой половиной согласен — 6 тактов, вторая половина могла бы уложиться в 5 без лишних сдвигов.
Итого 11 тактов против 15.
Код
uint8_t rsb(uint8_t a)
{    a = ((a & 0x55) << 1) | ((a & 0xAA) >> 1);
    return __swap_nibbles(a);
    a = ((a & 0x66) | (a & 0x99));        }

mov  r17,r16
lsr  r17
andi r17,0x55
lsr  r16
andi r16,0xAA
or   r16,r17
mov  r17,r16
swap r17
andi r17,0x66
andi r16,0x99
or   r16,r17
(ret)

у Вас какая-то полная фигня в асм тексте(и в С тоже)
после
lsr r17 и
lsr r16 и неиспользования в дальнейшем флага С
Вы младший бит ужо потеряли

короче, меньше 13 тактов и не надейтесь получить smile.gif
эта я Вам как "крупный специалист по перекладыванию битиков" гарантирую... smile.gif
Go to the top of the page
 
+Quote Post
x736C
сообщение Apr 28 2010, 00:36
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(singlskv @ Apr 28 2010, 00:58) *
у Вас какая-то полная фигня в асм тексте(и в С тоже)
после
lsr r17 и
lsr r16 и неиспользования в дальнейшем флага С
Вы младший бит ужо потеряли

короче, меньше 13 тактов и не надейтесь получить smile.gif
эта я Вам как "крупный специалист по перекладыванию битиков" гарантирую... smile.gif

Вы правы, действительно ошибся.
lsl надо заменить на rol, lsr на ror.
11 тактов и получится. Перепроверьте.
Соответственно код на Си тоже надо подправить.

Поправленный код
Код
mov  r17,r16
rol  r17
andi r17,0x55
ror  r16
andi r16,0xAA
or   r16,r17
mov  r17,r16
swap r17
andi r17,0x66
andi r16,0x99
or   r16,r17
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vny4ek   поменять местами биты в байте   Apr 25 2010, 19:34
- - zltigo   Цитата(Vny4ek @ Apr 25 2010, 21:34) 0х72=...   Apr 25 2010, 19:45
|- - aaarrr   Цитата(zltigo @ Apr 25 2010, 23:45) Не хи...   Apr 25 2010, 19:47
- - ASN   Vny4ek тут есть   Apr 25 2010, 19:53
- - Vny4ek   я это вижу как цикл на 8 шагов где проверяется зна...   Apr 25 2010, 20:04
- - baralgin   Сумбурное описание, но если правильно понял то тип...   Apr 25 2010, 20:04
|- - demiurg_spb   Если вопрос звучал так: "Как зеркалить биты в...   Apr 25 2010, 20:53
- - KRS   IMHO цикл тут неоптимален. Можно же стандартный сп...   Apr 25 2010, 20:46
- - baralgin   Цитата(KRS @ Apr 25 2010, 23:46) Можно же...   Apr 25 2010, 20:57
|- - zltigo   Цитата(baralgin @ Apr 25 2010, 22:57) Цик...   Apr 25 2010, 21:12
- - baralgin   Не поленился, проверил (плохая привычка меряться.....   Apr 25 2010, 21:55
|- - zltigo   Цитата(baralgin @ Apr 25 2010, 23:55) Не ...   Apr 25 2010, 22:04
|- - KRS   Цитата(baralgin @ Apr 26 2010, 01:55) ps:...   Apr 25 2010, 22:07
- - baralgin   Цитата(zltigo @ Apr 26 2010, 01:04) Сильн...   Apr 25 2010, 22:31
- - Vny4ek   я проще себе это представлял, не знаю только как н...   Apr 26 2010, 05:33
|- - zltigo   Цитата(Vny4ek @ Apr 26 2010, 07:33) я про...   Apr 26 2010, 06:58
|- - zltigo   Цитата(KRS @ Apr 26 2010, 09:56) Для AVR ...   Apr 26 2010, 08:14
|- - demiurg_spb   Цитата(KRS @ Apr 26 2010, 11:56) Даже есл...   Apr 26 2010, 20:59
||- - MrYuran   Цитата(demiurg_spb @ Apr 27 2010, 00:59) ...   Apr 27 2010, 09:06
|- - singlskv   Цитата(x736C @ Apr 28 2010, 04:36) Перепр...   Apr 28 2010, 08:03
- - Vny4ek   ЦитатаВсе плохо, Вы, как оказалось, не только напи...   Apr 26 2010, 17:12
|- - smac   Цитата(Vny4ek @ Apr 26 2010, 21:12) Инфы ...   Apr 26 2010, 19:45
- - sigmaN   Vny4ek вот как-то так: установить бит в байтеКодb ...   Apr 26 2010, 19:55
- - Vny4ek   sigmaN, спасибо большое. То что написали после вас...   Apr 27 2010, 05:02
|- - zltigo   Цитата(Vny4ek @ Apr 27 2010, 07:02) sigma...   Apr 27 2010, 07:35
- - sergeeff Jr.   Я по простому сделал (как и сказали, при помощи та...   Apr 27 2010, 06:15
- - akl   Может.   Apr 27 2010, 09:16
- - sergeeff Jr.   Блин крутые специалисты, вы проблему решаете или п...   Apr 27 2010, 22:55
|- - aaarrr   Цитата(sergeeff Jr. @ Apr 28 2010, 02:55)...   Apr 27 2010, 23:29
- - sergeeff Jr.   Я решаю задачи (взяв AVR с большим количеством пам...   Apr 28 2010, 00:09
|- - aaarrr   Цитата(sergeeff Jr. @ Apr 28 2010, 04:09)...   Apr 28 2010, 00:22
- - sigmaN   ЦитатаА во вторых человек настолько хреново разбир...   Apr 28 2010, 02:55
|- - ASN   sergeeff Jr Тут речь не оптимизации ради оптимизац...   Apr 28 2010, 15:21
- - x736C   Да, облажался. Мне показалось, АВР делает цикличес...   Apr 28 2010, 09:04
- - sergeeff Jr.   Такое впечатление, что все ваши начальники понимаю...   Apr 28 2010, 13:56
|- - zltigo   Цитата(sergeeff Jr. @ Apr 28 2010, 15:56)...   Apr 28 2010, 14:11
|- - aaarrr   Цитата(sergeeff Jr. @ Apr 28 2010, 17:56)...   Apr 28 2010, 14:13
- - sergeeff Jr.   Байт конечно, очепятался я. Я не говорил, что я н...   Apr 28 2010, 16:49
|- - KRS   Цитата(sergeeff Jr. @ Apr 28 2010, 20:49)...   Apr 28 2010, 22:11
- - sergeeff   Если обратите внимание, в последних книгах по прог...   Apr 28 2010, 17:35
- - aaarrr   Цитата(sergeeff Jr. @ Apr 28 2010, 20:49)...   Apr 28 2010, 18:05
- - sergeeff   Это все на тему - сделать работоспособное устройст...   Apr 28 2010, 20:41
- - Vny4ek   Всем большое спасибо за помощь. Сам понимаю что ту...   Apr 30 2010, 06:27


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:37
Рейтинг@Mail.ru


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