我想将signed short
变量的值限制在 0 到 4095 之间,之后我将最重要的 8 位作为最终值,以便在其他地方使用。现在我正在以如下基本方式进行操作:
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.
*/
有什么方法可以仅使用位操作来完成,即不使用任何条件?它可能有助于加快速度,因为此操作在代码中发生了数千次。
以下内容无济于事,因为它不处理负值和溢出等边缘情况:
unsigned char color8bit = 0xFF & (( 0x0FFF & color ) >> 4 );
编辑: 亚当·罗森菲尔德的答案是采用正确方法但实施不正确的答案。ouah 的回答给出了正确的结果,但采用了与我最初打算找出的不同的方法。
这就是我最终使用的:
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 );