Математическая операция для сохранения числа не меньше нуля

В программировании модуль полезен для сохранения чисел в диапазоне, не превышающем верхнего предела.

Например:

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

Мой вопрос: как установить предел нижней границы на 0 БЕЗ используя любое условное выражение, например, if или switch case?

Вывод хочу 5 4 3 2 1 0 0 0 0 0 0 0 ...

4

Решение

Как насчет std::max?

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

Другие решения

использование std::max(value,0) или троичный оператор. Оба будут компилироваться в код без условных переходов.

1

Возможно, это можно сделать с

typedef unsigned u32b;

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

который взят из Вот. В частности, кажется, что он реализует насыщенное вычитание; насыщенный декремент будет

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

и, кажется, без ветвей.

1

Две ситуации разные. Как вы показали, % заставит числа вращаться вокруг 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--) << " ";
0

с помощью max функция в std,
max функция детали:

template <class T> const T& max (const T& a, const T& b) {
return (a<b)?b:a;
}
0
По вопросам рекламы [email protected]