Seite 1 von 1

(gelöst)5 zu 8 Bits & umgekehrt

Verfasst: 05.02.2010, 00:48
von Krishty
Hi,

Der Threadtitel ist unklar, aber mit „Unsigned Normalized“ können die meisten ja noch weniger anfangen. Ich möchte Farbkanäle nur mit Bitlogik verbreitern oder schmälern, im speziellen Fall von 8 nach 5 Bits und wieder zurück. Die triviale Methode ist:

Code: Alles auswählen

unsigned int EightToFive(unsigned int Eight) {
    return Eight >> 3;
}
unsigned int FiveToEight(unsigned int Five) {
    return Eight << 3;
}
Das ist zu unpräzise, denn das 5-Bit-Maximum (31) wird nicht zum 8-Bit-Maximum (255), während das Minimum (0) bestehen bleibt.

Irgendwo gab es mal einen Beitrag oder kleinen Artikel dazu, wie man es optimal macht … ich weiß nicht mehr, wo, aber die Chance, dass ich über ZFX darauf gestoßen bin, ist recht hoch – darum frage ich hier wie man es richtig geht oder ob jemand einen Link am Mann hat :)

Gruß, Ky

Re: 5 zu 8 Bits & umgekehrt

Verfasst: 05.02.2010, 01:25
von Aramis
>> Das ist zu unpräzise, denn das 5-Bit-Maximum (31) wird nicht zum 8-Bit-Maximum (255), während das Minimum (0) bestehen bleibt.

Kurz: Skalierung von (0...31) auf (0...255) nur mit Bitoperationen.

31*8 sind 248, also 7 Differenz zum Wunschwert. Also: (8n + 7n/31).
1/4 ist eine sehr gute Annäherung an 7/31. Also sollte

Code: Alles auswählen

unsigned int FiveToEight(unsigned int n) {
   return n << 3u | n >> 2u;
}
ein sehr gutes Ergebnis liefern (hier für n==31).
EDIT - Addition durch bitwise-or ersetzt.

Re: 5 zu 8 Bits & umgekehrt

Verfasst: 05.02.2010, 01:38
von Krishty
Jaaa, genau das war’s – die freigewordenen niederwertigsten Bits des Ergebnisses mit den höchstwertigsten Bits des Originals auffüllen. Danke :)