[0..255]に制限されているピクセルの明るさのコードがあります。そして、それは何らかの理由で評価されているので、私は範囲外の価値を得ることができます。できます
(if x>maxValue) x = maxValue;
また
x = min(x, MaxValue);
また
(x > MaxValue) ? MaxValue : x;
しかし、私は良い方法は何だろうか?より少ない比較と優れたコードスタイルで値を制限するにはどうすればよいですか?
[0..255]に制限されているピクセルの明るさのコードがあります。そして、それは何らかの理由で評価されているので、私は範囲外の価値を得ることができます。できます
(if x>maxValue) x = maxValue;
また
x = min(x, MaxValue);
また
(x > MaxValue) ? MaxValue : x;
しかし、私は良い方法は何だろうか?より少ない比較と優れたコードスタイルで値を制限するにはどうすればよいですか?
xのintの代わりにunsignedcharを使用します。charは[0、255]に制限されています。オーバーフローをチェックする必要があるため、これは少し注意が必要です。
より少ない比較と優れたコードスタイルで値を制限するにはどうすればよいですか?
1つの比較は少なくとも、それ以下は比較がないことを意味します。これが必要な場合は、分岐せずに最小計算を見てください。
良いスタイルのために、これは最高です-
if (x > maxValue)
{
x = maxValue;
}
優れたコーディングスタイルに関しては、この値の境界要件を管理するための独自のクラスを作成できます。代入演算子をオーバーロードすると、そこで比較を行うことができます。
編集: 代わりに、すべてのコードを1つの関数に入れることができると思います。しかし、クラスインスタンスとのやり取りの方が良いと思います。
BoundedInt x;
x = 300;
x.value(); // x == 255
inline long clamp(long x, long min, long max){
return x>max ? max : (x<min ? min : x);
}
0から255までの値のみを受け入れ、暗黙的にintにキャストできる新しいクラスを作成できますが、clampやmaxなどを使用するだけで十分です。
私は推測します:
(x > MaxValue) ? MaxValue : x;
と同等です:
(if x>maxValue) x = maxValue;
else x = x;
最適化されるなど、自己割り当てなどで停止する可能性が高いことはわかっています。したがって、本質的には、最初の場合と同じですが、シンタックスシュガーコーティングだけです。
min
型の安全性を提供し、混合型の比較を避けるのに役立つので、私は使用します。