0

我有一个像素亮度限制为 [0..255] 的代码。并且出于某种原因对其进行了评估,因此我可以获得超出范围的价值。我可以

(if x>maxValue) x = maxValue;

或者

 x = min(x, MaxValue);

或者

(x > MaxValue) ? MaxValue : x;

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

4

5 回答 5

2

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

于 2012-09-20T12:50:58.283 回答
1

如何通过较少的比较和良好的代码风格来限制一个值?

一个比较是最少的,任何较小的都意味着没有比较。如果需要,请查看Compute minimum without branching 。

对于良好的风格,这是最好的 -

if (x > maxValue)
{
    x = maxValue;
}
于 2012-09-20T13:13:23.650 回答
0
inline long clamp(long x, long min, long max){
    return x>max ? max : (x<min ? min : x);
}

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

于 2012-09-20T12:56:27.797 回答
0

我猜:

(x > MaxValue) ? MaxValue : x;

相当于:

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

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

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

于 2012-09-20T13:12:12.473 回答
0

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

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

BoundedInt x;
x = 300;
x.value(); // x == 255
于 2012-09-20T13:52:16.547 回答