Хороший способ сделать предел стоимости

У меня есть код с яркостью пикселей, который ограничен [0..255].
И это почему-то оценивается, так что я могу получить ценность за пределами.
я могу сделать

(if x>maxValue) x = maxValue;

или же

 x = min(x, MaxValue);

или же

(x > MaxValue) ? MaxValue : x;

но мне интересно, что это хороший способ? Как ограничить значение меньшим количеством сравнений и хорошим стилем кода?

0

Решение

Как ограничить значение меньшим количеством сравнений и хорошим стилем кода?

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

Для хорошего стиля это лучше всего —

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

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

Используйте unsigned char вместо int для x, символы ограничены [0, 255]. Это немного сложно, хотя вы должны проверить на переполнение.

2

inline long clamp(long x, long min, long max){
return x>max ? max : (x<min ? min : x);
}

Вы можете написать новый класс, который принимает значения только от 0 до 255 и может быть неявно приведен к типу int, но достаточно использовать что-то вроде зажима или max.

0

Что касается хорошего стиля кодирования, вы можете создать свой собственный класс для управления этим ограничивающим значением требованием. Если вы перегружаете оператор присваивания, вы можете выполнить сравнение там.

Редактировать:
Я полагаю, вы могли бы просто поместить весь свой код в одну функцию вместо этого. Но я думаю, что взаимодействие с экземпляром класса было бы лучше.

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

Я бы догадался:

(x > MaxValue) ? MaxValue : x;

эквивалентно:

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

Я знаю, что высоки шансы, что он будет оптимизирован и т. Д., Или остановится при самостоятельном назначении и т. Д. Так что по сути это то же самое, что и первый if, только синтаксическое сахарное покрытие.

я хотел бы использовать min так как это обеспечит безопасность типов и поможет избежать сравнения смешанных типов.

0