【问题标题】:Nice way to make a limit to the value限制价值的好方法
【发布时间】:2012-09-20 12:48:34
【问题描述】:

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

(if x>maxValue) x = maxValue;

 x = min(x, MaxValue);

(x > MaxValue) ? MaxValue : x;

但我想知道什么是好方法?如何限制比较少且代码风格好的值?

【问题讨论】:

    标签: c++ performance code-standards


    【解决方案1】:

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

    【讨论】:

    • 太棒了,我喜欢它。但另一个答案更常见。
    • 在图像处理过程中使用无符号字符来表示像素是相当普遍的。
    • 我什至会说最好使用无符号字符来表示它们。
    【解决方案2】:

    如何限制比较少且代码风格良好的值?

    一个比较是最小的,任何较小的意味着没有比较。看Compute minimum without branching,如果你想要这个。

    为了好的风格,这是最好的 -

    if (x > maxValue)
    {
        x = maxValue;
    }
    

    【讨论】:

      【解决方案3】:
      inline long clamp(long x, long min, long max){
          return x>max ? max : (x<min ? min : x);
      }
      

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          我猜:

          (x > MaxValue) ? MaxValue : x;
          

          相当于:

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

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

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

          【讨论】:

            猜你喜欢
            • 2010-12-09
            • 1970-01-01
            • 2014-11-12
            • 1970-01-01
            • 1970-01-01
            • 2011-09-15
            • 1970-01-01
            • 2011-09-30
            • 1970-01-01
            相关资源
            最近更新 更多