保持数量不小于零的数学运算

时间:2014-04-03 14:57:10

标签: c++ math numbers limit operation

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

例如:

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 ...

5 个答案:

答案 0 :(得分:4)

std::max怎么样?

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

也许可以用

完成
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;
}

似乎没有分支。

答案 3 :(得分:0)

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

根据您是否将三元运算符视为条件运算符,您可以执行以下操作:

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

这会产生副作用,value一旦达到0就不会再减少。

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

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

答案 4 :(得分:0)

max中使用std功能 max function detail

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