Zum Optimieren habe ich dann mal diesen Entwurf:Ausgabe:Code:uint16_t ColorRGB216bit(uint16_t R, uint16_t G, uint16_t B) { return (R>>3<<11) | (G>>2<<5) | (B>>3); } void Color16bit2colorRGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) { R = (uint8_t) (color16 >> 11) << 3; G = (uint8_t)((color16 & 2016) >> 3); B = (uint8_t) (color16 & 31) << 3; Serial.println(""); Serial.println("Unterprogramm color16 zu RGB:"); Serial.println( (String)"color16="+(String)color16); Serial.println( (String)"R="+(String)R); Serial.println( (String)"G="+(String)G); Serial.println( (String)"B="+(String)B); }Mann kann R>>3<<11 und G>>2<<5 übrigens nicht zusammenfassen zu R<<8 und G<<3, weil durch die jeweils erste Shift-Operation die untersten Bit gelöscht werden - was wichtig ist. Man müsste dann zusätzlich wieder ein UND anhängen, um die untersten Bits zu löschen, damit wird der Ausdruck nicht kürzer. Beim Verschieben nach Rechts werden die unteren Bits ins Nirvana verschoben und beim Verschieben nach Links werden Nullen eingefügt. Das sind Standardoperationen, wo das Überlaufbit immer gelöscht ist, bzw. nicht berücksichtigt wird. Für bestimmte Zwecke gibt es das auf Maschinenspracheebene auch noch mit Berücksichtigung des Überlaufbits - ist hier nicht wichtig.Code:Hauptprogramm vor Aufruf: col16=0 r=255 g=102 b=78 Hauptprogramm nach rgb zu col16-Berechnung (rgb gelöscht): col16=64297 r=0 g=0 b=0 Unterprogramm color16 zu RGB: color16=64297 R=248 G=100 B=72 Hauptprogramm nach col16 zu rgb: col16=64297 r=248 g=100 b=72
Lesezeichen