Mam 3 bufory zawierające dane bitowe R, G, B działające na procesorze 32-bitowym.Bit Striping w C
Muszę połączyć trzy bajty w następujący sposób:
R[0] = 0b r1r2r3r4r5r6r7r8
G[0] = 0b g1g2g3g4g5g6g7g8
B[0] = 0b b1b2b3b4b5b6b7b8
int32_t Out = 0b r1g1b1r2g2b2r3g3 b3r4g4b4r5g5b5r6 g6b6r7g7b7r8g8b8 xxxxxxxx
gdzie xxxxxxxx kontynuuje się do każdego z kolejnych bajtów w buforach.
Szukam optymalnego sposobu na ich połączenie. Moje podejście zdecydowanie nie jest efektywne.
jest mój podejście
static void rgbcombineline(uint8_t line)
{
uint32_t i, bit;
uint8_t bitMask, rByte, gByte, bByte;
uint32_t ByteExp, rgbByte;
uint8_t *strPtr = (uint8_t*)&ByteExp;
for (i = 0; i < (LCDpixelsCol/8); i++)
{
rByte = rDispbuff[line][i];
gByte = gDispbuff[line][i];
bByte = bDispbuff[line][i];
bitMask = 0b00000001;
ByteExp = 0;
for(bit = 0; bit < 8; bit++)
{
rgbByte = 0;
rgbByte |= ((rByte & bitMask) >> bit) << 2;
rgbByte |= ((gByte & bitMask) >> bit) << 1;
rgbByte |= ((bByte & bitMask) >> bit);
ByteExp |= (rgbByte << 3*bit);
bitMask <<= 1;
}
TempLinebuff[((i*3)+0) +2] = *(strPtr + 2);
TempLinebuff[((i*3)+1) +2] = *(strPtr + 1);
TempLinebuff[((i*3)+2) +2] = *(strPtr + 0);
}
}
Być może (lub nie) dostać lepszą odpowiedź @ codereview.stackexchange.com –
Czy istnieją specjalne względy na środowisko - dostępności instrukcji wektorowych, wbudowany procesor lub ograniczenia architektury Detale? Może istnieć bardzo szybkie rozwiązanie, jeśli możesz wykorzystać funkcje procesora. – nneonneo
Jestem zdezorientowany, dlaczego to pytanie może pozostać otwarte, gdy każdego dnia pytania są odrzucane i są kierowane do przeglądu kodu, nawet jeśli pytanie dotyczy tej jakości. Czy ktoś może wyjaśnić? – Insane