【问题标题】:Mathematical operation to keep number not less than zero保持数字不小于零的数学运算
【发布时间】:2014-04-03 14:57:09
【问题描述】:

在编程中,模数有助于将数字保持在不超过上限的范围内。

例如:

int value = 0;
for (int x=0; x<100; x++)
    cout << value++%8 << " "; //Keeps number in range 0-7

输出: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7...


现在考虑这种情况:

int value = 5;
for (int x=0; x<100; x++)
    cout << value-- << " ";

输出:5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7...

我的问题是:如何使用 if 或 switch case 等任何条件语句将下限设置为 0 WITHOUT

我想要的输出:5 4 3 2 1 0 0 0 0 0 0 0 ...

【问题讨论】:

  • 有可能吗?但我只是觉得有可能..
  • @TheForestAndTheTrees 请不要那样做。
  • 如果我使用 unsigned int,我认为当它达到 -1 时它会循环回到最大值...65535? :P
  • @user3437460 如果您希望将负数转换为正整数,您可能会对 std::abs(int) (coliru.stacked-crooked.com/a/0f0e6aa6243f114b) 感兴趣 - 是的,它可能会溢出 unsigned int。跨度>

标签: c++ math numbers limit operation


【解决方案1】:

std::max怎么样?

int value = 5;
for (int x=0; x<100; x++) {
    cout << value << " ";
    value = std::max(0, --value);
}

【讨论】:

  • 这是一种可能性..hmm 还有其他建议吗?
  • @user3437460 接受答案或改进您的要求怎么样?我不明白为什么这还不够。
  • @tgmath 是的,他的回答很好。但我一直在寻找使用数学运算来获得解决方案的可能性。
  • max 和加法一样是数学运算。你给它一个有序集合中的两个元素作为输入,它返回同一个集合中的一个元素。它已经关闭,它甚至分发到min
【解决方案2】:

使用std::max(value,0) 或三元运算符。两者都将编译为没有条件跳转的代码。

【讨论】:

    【解决方案3】:

    也许可以用

    typedef unsigned u32b;
    
    u32b sat_subu32b(u32b x, u32b y)
    {
        u32b res = x - y;
        res &= -(res <= x); 
        return res;
    }
    

    取自here。更具体地说,它似乎实现了饱和减法;饱和减量为

    u32b sat_dec(u32bx)
    {
        u32b res = x-1;
        res &= -(res <= x); 
        return res;
    }
    

    而且似乎没有分支。

    【讨论】:

      【解决方案4】:

      这两种情况是不同的。正如您所展示的,% 将使数字从0 循环到7,而在否定的情况下,您似乎在要求max

      根据您是否将三元运算符算作条件,您可以这样做:

      int value = 5;
      for (int x=0; x<100; x++)
          cout << value > 0 ? value-- : 0 << " ";
      

      这样做的副作用是,一旦达到valuevalue 将不再递减。

      或者,您可以使用std::max

      int value = 5;
      for (int x=0; x<100; x++)
          cout << std::max(0, value--) << " ";
      

      【讨论】:

        【解决方案5】:

        std中使用max函数。
        max function detail

        template <class T> const T& max (const T& a, const T& b) {
          return (a<b)?b:a;     
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        相关资源
        最近更新 更多