Ich möchte den Wert einer signed short
zwischen 0 und 4095, wobei ich die höchstwertigen 8 Bits als endgültigen Wert für andere Zwecke verwende. Im Moment tue ich es in einer grundlegenden Weise wie unten:
short color = /* some external source */;
/*
* I get the color value as a 16 bit signed integer from an
* external source I cannot trust. 16 bits are being used here
* for higher precision.
*/
if ( color < 0 ) {
color = 0;
}
else if ( color > 4095 ) {
color = 4095;
}
unsigned char color8bit = 0xFF & (color >> 4);
/*
* color8bit is my final value which I would actually use
* in my application.
*/
Gibt es eine Möglichkeit, dies nur mit Bitmanipulation zu tun, d. h. ohne Verwendung von Konditionalen? Es könnte ziemlich viel helfen, die Dinge zu beschleunigen, da diese Operation Tausende von Zeit in den Code geschieht.
Das Folgende wird nicht helfen, da es sich nicht um Randfälle wie negative Werte und Überläufe kümmert:
unsigned char color8bit = 0xFF & (( 0x0FFF & color ) >> 4 );
Edita: Adam Rosenfields Antwort ist diejenige, die den richtigen Ansatz verfolgt, der aber nicht korrekt umgesetzt wird. Antwort von ouah liefert korrekte Ergebnisse, verfolgt aber einen anderen Ansatz als den, den ich ursprünglich herausfinden wollte.
Das habe ich schließlich verwendet:
const static short min = 0;
const static short max = 4095;
color = min ^ (( min ^ color ) & -( min < color ));
color = max ^ (( color ^ max ) & -( color < max ));
unsigned char color8bit = 0xFF & (( 0x0FFF & color ) >> 4 );