変数の値を0から4095の間に制限したいのですがsigned short
、その後、最上位の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 );