Posted By: Neuromancer (... bright eyes ...) on 'CZprogram'
Title:     Re: posuv v ramci 6 bytu (c)
Date:      Wed Feb  2 23:04:38 2005

> 
> > Hmm, asi nejak takhle by to melo fungovat
> > unsigned char* data;
> > for ( int i=0; i<length-1; ++i ) {
> >   data[i] = ( data[i]<<1 ) | ( data[i+1]>>7 );
> > }
> > data[length-1] <<= 1;
> > 
> > Snad jsem se neupsal :)
> 
> Jo, az na, ze me jde o to, aby se to prelozilo co nejeefektivneji,
> coz znamena jednu rotaci vlevlo na kazdy byte.
> Takhle mi jich to (pokud prekladac nebude opravdu genitalni, coz
> pochybuju) udela na kazdy byte 8 (ten mikrochip neumi jiny rotace,
> nez o 1 bit).

Pokud ten mikrochip umi rychle pristupovat na jednotlive bajty, tak 
muzes zkusit neco na zpusob
uint16 shifted; //unsigned short nebo co funguje na tvem kompilatoru
unsigned char* shifted2 = &shifted;
for ( int i=0; i<length-1; ++i ) {
  shifted2[1] = data[i];    //pro LSB stroje, jinak prohod 1 a 0
  shifted2[0] = data[i+1];
  shifted<<=1;
  data[i] = shifted2[1];  
}
data[length-1] <<= 1;

Ale nevim, jak moc pekne (nebo hnusne) to ten kompilator zoptimalizuje (mozna 
by bylo lepsi udelat misto toho alias pointeru union).

Nicmene jestli je ten mikrochip opravdu hodne pomaly tak bude lepsi zkusit
assembler. 

> No nic, asi se budu muset jit naucit vnoreny assembler do gcc...
> co jsem zatim videl to moc vabne nevypada :(((
> 
> 
> Chomer
> 
>                                                  Hodlam vytmavovat.
--------------------------------------------------------------------/
|       ICQ 20529980                               Neuromancer       |
|              Take me far away, where the dragons fly,              |
/------------ leave me to my dreams, or just let me die. ------------

Search the boards