|
Алгоритм, перестановка битов |
|
|
|
Aug 1 2006, 05:37
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558

|
Помогите найти алгоритм наиболее быстрый, для перестановки битов R->R ----- 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0 1). Простой, сдвиговый с иполозование бита переноса региста флагов ldi cnt,8 loop: rol tmp ror tmp1 dec cnt brne loop mov tmp,tmp1 занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 1 2006, 07:58
|
Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148

|
Для PIC'а это выглядит так:
<CODE> ;*************************************************************** ; Routine: reverse8bit ; Инверсия байта ; Input X = abcdefgh , Output X = hgfedcba ; Written by Dmitry A. Kiryashov 2000 ; 12 clocks/words ; (!) Переменная BUFINT не должна использоваться вне прерывания ;*************************************************************** reverse8bit: SWAPF BUFINT, w ;efghabcd XORWF BUFINT, w ;efghabcd ;abcdefgh ANDLW 0x66 ;.fg..bc. ;.bc..fg. XORWF BUFINT, f ;afgdebch RRF BUFINT, w RRF BUFINT, f ;hafgdebc ANDLW 0x55 ;.a.g.e.c ADDWF BUFINT, f ;h.f.d.b. ;a.g.e.c. RRF BUFINT, f ;.h.f.d.b ;.a.g.e.c ADDWF BUFINT, f ;ahgfedcb RLF BUFINT, w RLF BUFINT, w ; Результат в аккумуляторе RETURN ;*************************************************************** </CODE>
|
|
|
|
|
Aug 1 2006, 08:15
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата занимает 8байт памяти, время выполнения 5мкс Я думаю Вы поторопились с расчетами... 1 команда занимает 1слово(2байта) Цитата Помогите найти алгоритм наиболее быстрый, для перестановки битов rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 rol tmp ror tmp2 Наверное самый быстрый. 16 тактов (1мкс 16МГц)32 байт
Сообщение отредактировал add - Aug 1 2006, 08:18
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Aug 1 2006, 12:25
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Slavik_tz @ Aug 1 2006, 08:37)  Помогите найти алгоритм наиболее быстрый, для перестановки битов R->R ----- 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0 1). Простой, сдвиговый с иполозование бита переноса региста флагов ldi cnt,8 loop: rol tmp ror tmp1 dec cnt brne loop mov tmp,tmp1 занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше Например так: Код char bit_reverse (char bits) { bits = ((bits & 0x0F) << 4) | ((bits & 0xF0) >> 4); bits = ((bits & 0x33) << 2) | ((bits & 0xcc) >> 2); bits = ((bits & 0x55) << 1) | ((bits & 0xaa) >> 1); return bits; }
|
|
|
|
|
Aug 1 2006, 16:45
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(add @ Aug 1 2006, 12:15)  rol tmp ror tmp2 rol tmp ror tmp2 ... Наверное самый быстрый. 16 тактов (1мкс 16МГц)32 байт Вот так будет короче и быстрее: Код ; 13 words / 13 cycles ; tmp= abcdefgh mov tmp2,tmp ; tmp2= abcdefgh andi tmp2,0b01010101 ; tmp2= 0b0d0f0h andi tmp, 0b10101010 ; tmp= a0c0e0g0 bst tmp2,0 ; T=h lsr tmp2 ; tmp2= 00b0d0f0 bld tmp2,7 ; tmp2= h0b0d0f0 lsl tmp ; tmp= 0c0e0g00 C=a adc tmp, tmp2 ; tmp= hcbedgfa mov tmp2,tmp ; tmp2= hcbedgfa andi tmp2,0b01100110 ; tmp2= 0cb00gf0 swap tmp2 ; tmp2= 0gf00cb0 andi tmp, 0b10011001 ; tmp= h00ed00a add tmp, tmp2 ; tmp= hgfedcba
|
|
|
|
|
Aug 1 2006, 20:36
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Или вот так: Код ; 13 words / 13 cycles ; tmp= abcdefgh mov tmp2,tmp ; tmp2= abcdefgh lsr tmp2 ; tmp2= 0abcdefg C=h ror tmp ; tmp= habcdefg C=h andi tmp, 0b10101010; tmp= h0b0d0f0 andi tmp2,0b01010101; tmp2= 0a0c0e0g lsl tmp2 ; tmp2= a0c0e0g0 C=0 lsl tmp2 ; rmp2= 0c0e0g00 C=a adc tmp, tmp2 ; tmp= hcbedgfa mov tmp2,tmp ; tmp2= hcbedgfa andi tmp2,0b01100110; tmp2= 0cb00gf0 swap tmp2 ; tmp2= 0gf00cb0 andi tmp, 0b10011001; tmp= h00ed00a add tmp, tmp2 ; tmp= hgfedcba Это если флаг Т не использовать. Блин, а похоже что короче и не получится, ну нету у AVR некоторых команд. Например XOR Rxx,K или ADC Rxx,K.
|
|
|
|
|
Aug 2 2006, 04:41
|
Местный
  
Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044

|
Цитата(Slavik_tz @ Aug 1 2006, 08:37)  1). Простой, сдвиговый с иполозование бита переноса региста флагов ldi cnt,8 loop: rol tmp ror tmp1 dec cnt brne loop mov tmp,tmp1 занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше А так больше нравиться? Код ldi tmp1,$80 loop: rol tmp ror tmp1 brcc loop mov tmp,tmp1;это не обязательно, если ожидать и использовать результат в tmp1
Сообщение отредактировал CDT - Aug 2 2006, 04:54
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
|
Aug 2 2006, 05:27
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558

|
Всем большое спасибо за помощь!!!
|
|
|
|
|
Aug 2 2006, 05:39
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558

|
Цитата(CDT @ Aug 2 2006, 07:41)  Цитата(Slavik_tz @ Aug 1 2006, 08:37)  1). Простой, сдвиговый с иполозование бита переноса региста флагов ldi cnt,8 loop: rol tmp ror tmp1 dec cnt brne loop mov tmp,tmp1 занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше
А так больше нравиться? Код ldi tmp1,$80 loop: rol tmp ror tmp1 brcc loop mov tmp,tmp1;это не обязательно, если ожидать и использовать результат в tmp1 Класный алгоритм, мне понравился
|
|
|
|
|
Aug 2 2006, 05:51
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558

|
Цитата(Andy Mozzhevilov @ Aug 1 2006, 11:26)  Цитата(Slavik_tz @ Aug 1 2006, 11:37)  занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше
Что не устраивает? Объем занимаемой памяти, время выполнения? Найти такой который занимал меньше места в памяти программ, использовал меньшее колличество регистров и выполнялся как можно быстрее. Есть разводка платы в которой выходы микроконтолера подключены к ЖКИ задом наперед. Плата ограничена корпусом и оптимальная разводка получается именно так, одностороняя и 4 перемычки. Возможно можно развести по другому но это добавляет работы с платой, как на меня лучше поменять что-то в программе, чем долбится с платой, тем более она нужна только на некоторое время а потом в корзину с мусором
|
|
|
|
|
Aug 2 2006, 06:11
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558

|
Цитата(singlskv @ Aug 1 2006, 19:45)  Цитата(add @ Aug 1 2006, 12:15)  rol tmp ror tmp2 rol tmp ror tmp2 ... Наверное самый быстрый. 16 тактов (1мкс 16МГц)32 байт
Вот так будет короче и быстрее: Код ; 13 words / 13 cycles ; tmp= abcdefgh mov tmp2,tmp ; tmp2= abcdefgh andi tmp2,0b01010101; tmp2= 0b0d0f0h andi tmp, 0b10101010; tmp= a0c0e0g0 bst tmp2,0 ; T=h lsr tmp2 ; tmp2= 00b0d0f0 bld tmp2,7 ; tmp2= h0b0d0f0 lsl tmp ; tmp= 0c0e0g00 C=a adc tmp, tmp2 ; tmp= hcbedgfa mov tmp2,tmp ; tmp2= hcbedgfa andi tmp2,0b01100110; tmp2= 0cb00gf0 swap tmp2 ; tmp2= 0gf00cb0 andi tmp, 0b10011001; tmp= h00ed00a add tmp, tmp2 ; tmp= hgfedcba интересный, никогда не догадался, как по скорости класс, фантазии хоть отбавляй надо подумать может можно еще что-то придумать. спасибо
|
|
|
|
|
Aug 2 2006, 06:11
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата ; 13 words / 13 cycles ; tmp= abcdefgh mov tmp2,tmp ; tmp2= abcdefgh andi tmp2,0b01010101 ; tmp2= 0b0d0f0h andi tmp, 0b10101010 ; tmp= a0c0e0g0 bst tmp2,0 ; T=h lsr tmp2 ; tmp2= 00b0d0f0 bld tmp2,7 ; tmp2= h0b0d0f0 lsl tmp ; tmp= 0c0e0g00 C=a adc tmp, tmp2 ; tmp= hcbedgfa mov tmp2,tmp ; tmp2= hcbedgfa andi tmp2,0b01100110 ; tmp2= 0cb00gf0 swap tmp2 ; tmp2= 0gf00cb0 andi tmp, 0b10011001 ; tmp= h00ed00a add tmp, tmp2 ; tmp= hgfedcba да...век живи век учись. .. Скажите singlskv где таким алгоритмам учат? :-) (может в компиляторах подсмотрели?)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|