Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

размяна на битове
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=14181
Страница 1 от 2

Автор:  Н'бабане Гт'муан'га [ Нед Ное 22, 2015 2:14 pm ]
Заглавие:  размяна на битове

Нещо съм блокирал май... :-x
Има ли елегантен начин за размяна само на битове 7<->8, 6<->9, 5<->11, 4<->12, без да се закачат останалите, в един unsigned int?
Сигурен съм че има, ама в момента ми убягва.

Автор:  DanielDimov [ Нед Ное 22, 2015 2:43 pm ]
Заглавие:  Re: размяна на битове

с таблица ще стане най-лесно и най-бързо

Автор:  miro_atc [ Нед Ное 22, 2015 3:31 pm ]
Заглавие:  Re: размяна на битове

За много платформи има инструкции за byte order (REV) и bit order (RBIT), доколкото схващам ти трябват и двете, т.е.

unsigned int foo(unsigned int x)
{
return __RBIT(__REV16(x))>>16;
}

евентуално foo може да е inline и ако компилираш с Ц++ може да е constexpr.

Автор:  palavrov [ Нед Ное 22, 2015 5:23 pm ]
Заглавие:  Re: размяна на битове

Те всъщност са 8 бита - просто трябва първо да >>4 после обръщаш битовете в целия байт и накрая <<4. Обръщането според архитектурата - ако има CPU инструкция добре, ако не с таблица.

Автор:  miro_atc [ Нед Ное 22, 2015 7:17 pm ]
Заглавие:  Re: размяна на битове

Верно ли само изброените битове? Че и с дупка ;-)

Значи нещо от сорта:

Код:
uint32_t foo(uint32_t x)
{
   uint32_t a, b, mask;
   
   mask = 0x950;
   a = x & mask;      // bits 11 8 6 4
   x ^= a;
   mask += mask << 1;
   b = x & mask;      // bits 12 9 7 5
   x ^= b;
   
   a += a + (b>>1);   // bits 11 12 _ 8 9 6 7 4 5

   b = a >> 7;
   b += a << 7;
   x += b & mask;      // bits 4 5 _ _ _ _ _ 11 12
   
   x += (a & 0xC) << 2; // bits 4 5 _ 6 7 _ _ 11 12
   
   x += (a >> 2) & 0xC; // bits 4 5 _ 6 7 8 9 11 12
   
   return x;
}

Автор:  Н'бабане Гт'муан'га [ Нед Ное 22, 2015 8:46 pm ]
Заглавие:  Re: размяна на битове

Всъщност размяната даже е малко по сложна отколкото я описах :)
В едната посока е 4->7, 5->8, 6->9, 7->10
В другата е 7->11, 6->10, 5->9, 4->8

След приличен обяд успях да вържа някакъв код, ама тепърва ще го пробвам... (k[r] ми е 16-битовото число)

Код:
unsigned char c=(k[r] & 0x0ff0)>>4;
    c=(c>>4) | (c<<4);
    c=(c & 0xf0) | xb[c & 0x0f];
    k[r]=(k[r] & 0xf00f) | ((unsigned int)c<<4);


като xb[] табличката е

Код:
const unsigned char xb[16] = {0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111};

Автор:  miro_atc [ Нед Ное 22, 2015 9:12 pm ]
Заглавие:  Re: размяна на битове

Е не е по-сложно... това за каква платформа е? Питам щото ако е arm както си го написал е супер неефективно :wink:

Автор:  Н'бабане Гт'муан'га [ Нед Ное 22, 2015 9:24 pm ]
Заглавие:  Re: размяна на битове

Arm?? Тва пък какво е? (подразбира се че не е...)
Виж сега, аз не се смятам за велик програматор. Моята философия е по-обща.
Ако си в настроение да ми подобриш кода, ще ти благодаря (между псувните че не съм се сетил сам ;))

Автор:  miro_atc [ Нед Ное 22, 2015 10:04 pm ]
Заглавие:  Re: размяна на битове

За съжаление кристалното ми кълбо се повреди и няма как да разбера какъв тип архитектура и какъв компилатор ползваш.

Автор:  Н'бабане Гт'муан'га [ Нед Ное 22, 2015 10:14 pm ]
Заглавие:  Re: размяна на битове

Ми да беше споменал. Аз съм зарит от кристални кълба дето не ги ползвам. Пик16 ми е архитектурата за това и ХС8 компилатор

Автор:  miro_atc [ Нед Ное 22, 2015 11:51 pm ]
Заглавие:  Re: размяна на битове

Ти направо ме закопа... не съм ги чувал тия ;-)

Единственото дето знам е че май са 8-бит... Компилаторът пък хептен нищо не ми говори, все пак ако е добър в оптимизациите може би не трябва да му се пречкаш с междинни променливи. Пробвай с един голям израз директно да му дадеш резултата пък той да си преценява

т.е. нещо от сорта:

k[r]=(k[r] & 0xf00f) | ((k[r] & 0xf0) << 4 ) | ((unsigned int)xb[(k[r]>>8) & 0xf] << 4);

Просто виж какъв асемблер генерира и прецени. Ак о с общия израз e добре, може да го подобриш още като преместиш последния шифт от кода в таблицата. Тя нали е 8 битова, т.е. да шифтнеш стойностите й.

Автор:  TheWizard [ Пон Ное 23, 2015 8:08 am ]
Заглавие:  Re: размяна на битове

/*-------------------------------------------------------------------------
* Some useful macros for inline assembly stuff
*-------------------------------------------------------------------------*/
#define Nop() {_asm nop _endasm}
#define ClrWdt() {_asm clrwdt _endasm}
#define Sleep() {_asm sleep _endasm}
#define Reset() {_asm reset _endasm}

#define Rlcf(f,dest,access) {_asm movlb f rlcf f,dest,access _endasm}
#define Rlncf(f,dest,access) {_asm movlb f rlncf f,dest,access _endasm}
#define Rrcf(f,dest,access) {_asm movlb f rrcf f,dest,access _endasm}
#define Rrncf(f,dest,access) {_asm movlb f rrncf f,dest,access _endasm}
#define Swapf(f,dest,access) {_asm movlb f swapf f,dest,access _endasm }

виж какво прави последния ред

Автор:  CarBeta [ Пон Ное 23, 2015 9:59 am ]
Заглавие:  Re: размяна на битове

Последния ред, а и предните 4, са за пик18. Човека търси решение за пик16.
@Н'бабане, ако те устройва на асемблер мога да бутна едно рамо

Автор:  bobihot [ Пон Ное 23, 2015 12:27 pm ]
Заглавие:  Re: размяна на битове

Повечето МП архитектури имат инструкция за размени тетрадите в байта. Та май такава ти трябва.
SWAP в x51. При пиковете-ненам.

Автор:  Н'бабане Гт'муан'га [ Пон Ное 23, 2015 12:53 pm ]
Заглавие:  Re: размяна на битове

@CarBeta, мерси настина, но няма да ми трябва асемблер. Всъщност аз съм го загърбил от години вече и винаги гледам да мина по най-правата крива :)
В общи линии това което съм сътворил ми върши работа, оттук нататък всички оптимизации ще са единствено за спорта.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/