限制值的好方法

Nice way to make a limit to the value

本文关键字:方法      更新时间:2023-10-16

我有一个像素亮度限制为 [0..255] 的代码。并且出于某种原因对其进行了评估,因此我可以在边界之外获得值。我能做到

(if x>maxValue) x = maxValue;

 x = min(x, MaxValue);

(x > MaxValue) ? MaxValue : x;

但我想知道什么是好方法?如何限制一个值,减少比较和良好的代码风格?

对 x 使用无符号字符而不是 int,字符限制为 [0, 255]。这有点棘手,因为您必须检查溢出。

如何限制一个值,减少比较和良好的代码风格?

一个比较是最少的,任何更少意味着没有比较。如果需要,请查看不带分支的最小计算。

对于好的风格,这是最好的——

if (x > maxValue)
{
    x = maxValue;
}
inline long clamp(long x, long min, long max){
    return x>max ? max : (x<min ? min : x);
}

您可以编写一个新类,该类仅接受 0 到 255 之间的值,并且可以隐式转换为 int,但使用 clamp 或 max 之类的东西就足够了。

就良好的编码风格而言,您可以创建自己的类来管理此值边界要求。 如果重载赋值运算符,则可以在那里进行比较。

编辑:我想你可以把所有代码放在一个函数中。 但我认为与类实例交互会更好。

BoundedInt x;
x = 300;
x.value(); // x == 255

我猜:

(x > MaxValue) ? MaxValue : x;

相当于:

(if x>maxValue) x = maxValue;
else x = x;

我知道它很有可能被优化等,或者停止自我分配等。所以本质上它与第一个 if 相同,只是语法糖衣。

我会使用 min,因为它将提供类型安全性,并有助于避免比较混合类型。