我有一个像素亮度限制为 [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,字符限制为 [0, 255]。这有点棘手,因为您必须检查溢出。
如何通过较少的比较和良好的代码风格来限制一个值?
一个比较是最少的,任何较小的都意味着没有比较。如果需要,请查看Compute minimum without branching 。
对于良好的风格,这是最好的 -
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 之类的东西就足够了。
我猜:
(x > MaxValue) ? MaxValue : x;
相当于:
(if x>maxValue) x = maxValue;
else x = x;
我知道它很有可能会被优化掉等等,或者停止在自我分配等。所以本质上它与第一个 if 相同,只是语法糖衣。
我会使用min
它,因为它将提供类型安全,并有助于避免比较混合类型。
就良好的编码风格而言,您可以创建自己的类来管理此值限制要求。如果重载赋值运算符,则可以在那里进行比较。
编辑: 我想您可以将所有代码放在一个函数中。但我认为与类实例交互会更好。
BoundedInt x;
x = 300;
x.value(); // x == 255