|
поменять местами биты в байте, простой вопрос |
|
|
|
 |
Ответов
|
Apr 25 2010, 21:55
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Не поленился, проверил (плохая привычка меряться.. на ночь глядя  ). 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
|
|
|
|
|
Apr 25 2010, 22:04
|

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

|
Цитата(baralgin @ Apr 25 2010, 23:55)  Не поленился Сильно поленились - у Автора всего лишь AVR а не Atlon . А во вторых и для AVR8 это фатально, переврали мои примеры и вписали int вместо insigned char. В третьих, а почему свой вариант не протестировали  ? Вот как он выглядит на 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
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|