Метод HackersDelight работает. Сравнение производительности прямого и оптимизированного метода вращения битовой матрицы. http://caxapa.ru/299233.html
Оптимизированный метод практически в 6 раз быстрее прямого. (STM32L152 работает на частоте 32 МГц, клетка на осциллограмме 1 мс, компилятор IAR).
void test_transpose(void)
{
unsigned char a[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // diagonal matrix
unsigned char b[8],i,k;
unsigned int j;
for(i = 0;i < 8; i++) b[i] = 0;
for(j = 0; j < 50000; j++)
{
led_on(1);
for(i = 0; i < 200; i++)
{
optimized_transpose_8x8(a,b);
for(k = 0;k < 8; k++) b[k] = 0;
}
led_on(0);
for(i = 0; i< 200; i++)
{
direct_transpose(a,b);
for(k = 0;k < 8; k++) b[k] = 0;
}
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void optimized_transpose_8x8(unsigned char *src, unsigned char *dst)
{
register unsigned int x,y,t;
x = (*src<<24) | ((*(src+1))<<16) | ((*(src+2))<<8) | (*(src+3));
y = (*(src+4)<<24) | ((*(src+5))<<16) | ((*(src+6))<<8) | (*(src+7));
t = (x^(x >> 7)) & 0x00aa00aa; x = x ^ t ^ (t << 7);
t = (y^(y >> 7)) & 0x00aa00aa; y = y ^ t ^ (t << 7);
t = (x^(x >> 14)) & 0x0000cccc; x = x ^ t ^ (t << 14);
t = (y^(y >> 14)) & 0x0000cccc; y = y ^ t ^ (t << 14);
t = (x & 0xf0f0f0f0) | ((y >> 4) & 0x0f0f0f0f);
y = ((x << 4)& 0xf0f0f0f0) | (y & 0x0f0f0f0f);
*dst = t>>24; (*(dst+1)) = t>>16; (*(dst+2)) = t>>8; (*(dst+3) = t);
*(dst+4) = y>>24;(*(dst+5)) = y>>16; (*(dst+6)) = y>>8; (*(dst+7) = y);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void direct_transpose(unsigned char *ta, unsigned char *tb)
{
unsigned char mask;
unsigned char *pdst;
register unsigned int i = 0;
do{
mask = 0x01;
pdst = tb;
do{
if(*ta & mask)*pdst = *pdst | (1 << i);
pdst++;
mask <<= 1;
}while(mask);
ta++;
i++;
}while(i<8);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
Оптимизированный метод практически в 6 раз быстрее прямого. (STM32L152 работает на частоте 32 МГц, клетка на осциллограмме 1 мс, компилятор IAR).