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

 
 
> поменять местами биты в байте, простой вопрос
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

Сообщений в этой теме
- 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
|- - x736C   Цитата(singlskv @ Apr 28 2010, 00:58) у В...   Apr 28 2010, 00:36
|- - 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 Текстовая версия Сейчас: 24th July 2025 - 06:34
Рейтинг@Mail.ru


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