Ich habe 3 Puffer mit R, G, B Bitdaten, die auf einem 32-Bit-Prozessor laufen.Bit Striping in C
Ich brauche die drei Bytes in der folgenden Art und Weise zu kombinieren:
R[0] = 0b r1r2r3r4r5r6r7r8
G[0] = 0b g1g2g3g4g5g6g7g8
B[0] = 0b b1b2b3b4b5b6b7b8
int32_t Out = 0b r1g1b1r2g2b2r3g3 b3r4g4b4r5g5b5r6 g6b6r7g7b7r8g8b8 xxxxxxxx
wo xxxxxxxx weiterhin in den Puffern zu jedem des nächsten Bytes auf.
Ich bin auf der Suche nach einer optimalen Möglichkeit, sie zu kombinieren. Mein Ansatz ist definitiv nicht effizient.
Hier ist mein Ansatz
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);
}
}
Sie können (oder auch nicht) bessere Antwort bekommen @ codereview.stackexchange.com –
es besondere Überlegungen auf die Umwelt sind - Verfügbarkeit von Vektorinstruktionen, Embedded-Prozessor Einschränkungen oder Architektur Einzelheiten? Es kann eine sehr schnelle Lösung geben, wenn Sie Prozessorfunktionen ausnutzen können. – nneonneo
Ich bin verwirrt, warum diese Frage offen bleiben darf, wenn jeden Tag Fragen abgelehnt werden und verwiesen auf Code Review, auch wenn die Frage von dieser Qualität ist. Kann jemand das erklären? – Insane