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

 
 
> поменять местами биты в байте, простой вопрос
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
Ответов
baralgin
сообщение Apr 25 2010, 21:55
Сообщение #2


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Не поленился, проверил (плохая привычка меряться.. на ночь глядя smile.gif ).
CODE
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdint.h>

static uint8_t InverseByte_zltigo(int b )
{
int ret = 0;
for( int i = 0x80; i; i >>= 1 )
{
if( b & 1 )
ret |= i;
b >>= 1;
}
return ret;
}

static uint8_t InverseByte_zltigo2(int b )
{
int ret = 0;
for( int i = 0x80; b; b >>= 1 )
{
if( b & 1 )
ret |= i;
i >>= 1;
}
return ret;
}

static uint8_t InverseByte(int b )
{
return
(
(b & 0x01) << 7 |
(b & 0x02) << 5 |
(b & 0x04) << 3 |
(b & 0x08) << 1 |
(b & 0x10) >> 1 |
(b & 0x20) >> 3 |
(b & 0x40) >> 5 |
(b & 0x80) >> 7
);
}

static void Benchmark( uint8_t (*test_func)(int))
{
LARGE_INTEGER start, end;
QueryPerformanceCounter(&start);
int seed = 0x72;
for(int i = 0; i < 100000000; i++ )
seed = test_func(seed);
QueryPerformanceCounter(&end);
std::cout << "time=" << end.QuadPart - start.QuadPart << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
Benchmark( &InverseByte_zltigo );
Benchmark( &InverseByte_zltigo2 );
Benchmark( &InverseByte );

return 0;
}

Результат на моём процессоре (A64, Brisbane, L2=512kb):
time=11045076
time=6801262
time=3793456

Видимо сравнения мешают. Я внёс немного самодеятельности и обозвал все внутренние переменные int'ом - так быстрее(для всего что выше avr).

ps: но по скорости всё равно таблица рулит, как предложили выше.
ps2: мой развёрнутый цикл идёт из немного модифицированного первого варианта: ret |= ( ( b & ( 1 << i ) ) >>i ) << ( 7 - i );
ps3: от порядка следования тестов результат конечно же зависит, но кардинально ничего не меняет.

Сообщение отредактировал baralgin - Apr 25 2010, 22:02
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 25 2010, 22:04
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(baralgin @ Apr 25 2010, 23:55) *
Не поленился

Сильно поленились - у Автора всего лишь AVR а не Atlon . А во вторых и для AVR8 это фатально, переврали мои примеры и вписали int вместо insigned char. В третьих, а почему свой вариант не протестировали smile.gif?
Вот как он выглядит на AVR8:
Код
     15          BYTE InverseByte(BYTE b)
   \                     InverseByte:
     16          {
   \   00000000   2F59               MOV     R21, R25
   \   00000002   2F68               MOV     R22, R24
   \   00000004   2F30               MOV     R19, R16
     17              BYTE ret = 0;
   \   00000006   E020               LDI     R18, 0
     18              for( int i = 0; i < 8; i++ )
   \   00000008   E080               LDI     R24, 0
   \   0000000A   E090               LDI     R25, 0
     19              {
     20                  ret |= ( ( b & ( 1 << i )  ) ? 1 : 0 ) << ( 7 - i );
   \                     ??InverseByte_0:
   \   0000000C   2F48               MOV     R20, R24
   \   0000000E   E001               LDI     R16, 1
   \   00000010   E010               LDI     R17, 0
   \   00000012   ....               RCALL   ?S_SHL_L02
   \   00000014   2F13               MOV     R17, R19
   \   00000016   2310               AND     R17, R16
   \   00000018   F011               BREQ    ??InverseByte_1
   \   0000001A   E001               LDI     R16, 1
   \   0000001C   C001               RJMP    ??InverseByte_2
   \                     ??InverseByte_1:
   \   0000001E   E000               LDI     R16, 0
   \                     ??InverseByte_2:
   \   00000020   E010               LDI     R17, 0
   \   00000022   E047               LDI     R20, 7
   \   00000024   1B48               SUB     R20, R24
   \   00000026   ....               RCALL   ?S_SHL_L02
   \   00000028   2B20               OR      R18, R16
     21              }
   \   0000002A   9601               ADIW    R25:R24, 1
   \   0000002C   3088               CPI     R24, 8
   \   0000002E   E000               LDI     R16, 0
   \   00000030   0790               CPC     R25, R16
   \   00000032   F364               BRLT    ??InverseByte_0
     22              return ret;
   \   00000034   2F02               MOV     R16, R18
   \   00000036   2F86               MOV     R24, R22
   \   00000038   2F95               MOV     R25, R21
   \   0000003A   9508               RET
     23          }

А так нормально написанный цикл
Код
     15          BYTE InverseByte(BYTE b)
   \                     InverseByte:
     16          {
     17              BYTE ret = 0;
   \   00000000   E020               LDI     R18, 0
     18              for( BYTE i = 0x80; i; i >>= 1 )
   \   00000002   E810               LDI     R17, 128
     19              {
     20                  if( b & 1 )
   \                     ??InverseByte_0:
   \   00000004   FB00               BST     R16, 0
   \   00000006   F40E               BRTC    ??InverseByte_1
     21                      ret |= i;
   \   00000008   2B21               OR      R18, R17
     22                  b >>= 1;
   \                     ??InverseByte_1:
   \   0000000A   9506               LSR     R16
     23              }
   \   0000000C   9516               LSR     R17
   \   0000000E   F7D1               BRNE    ??InverseByte_0
     24              return( ret );
   \   00000010   2F02               MOV     R16, R18
   \   00000012   9508               RET
     25          }


А в четвертых попробуйте этот Ваш сравнительный тест, например, на 0x01 и узнаете немного о везении.


--------------------
Feci, quod potui, faciant meliora potentes
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
|- - 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
- - KRS   Для AVR все равно быстрее так Кодuint8_t rsb(u...   Apr 26 2010, 07:56
|- - 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   Цитата(KRS @ Apr 26 2010, 11:56) Для AVR ...   Apr 27 2010, 01:53
|- - singlskv   Цитата(x736C @ Apr 27 2010, 05:53) С перв...   Apr 27 2010, 20:58
|- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:54
Рейтинг@Mail.ru


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