У меня есть код с яркостью пикселей, который ограничен [0..255].
И это почему-то оценивается, так что я могу получить ценность за пределами.
я могу сделать
(if x>maxValue) x = maxValue;
или же
x = min(x, MaxValue);
или же
(x > MaxValue) ? MaxValue : x;
но мне интересно, что это хороший способ? Как ограничить значение меньшим количеством сравнений и хорошим стилем кода?
Как ограничить значение меньшим количеством сравнений и хорошим стилем кода?
Одно сравнение наименьшее, любое меньшее означает, что нет сравнения. смотреть на Вычислить минимум без ветвления, если ты этого хочешь.
Для хорошего стиля это лучше всего —
if (x > maxValue)
{
x = maxValue;
}
Используйте unsigned char вместо int для x, символы ограничены [0, 255]. Это немного сложно, хотя вы должны проверить на переполнение.
inline long clamp(long x, long min, long max){
return x>max ? max : (x<min ? min : x);
}
Вы можете написать новый класс, который принимает значения только от 0 до 255 и может быть неявно приведен к типу int, но достаточно использовать что-то вроде зажима или max.
Что касается хорошего стиля кодирования, вы можете создать свой собственный класс для управления этим ограничивающим значением требованием. Если вы перегружаете оператор присваивания, вы можете выполнить сравнение там.
Редактировать:
Я полагаю, вы могли бы просто поместить весь свой код в одну функцию вместо этого. Но я думаю, что взаимодействие с экземпляром класса было бы лучше.
BoundedInt x;
x = 300;
x.value(); // x == 255
Я бы догадался:
(x > MaxValue) ? MaxValue : x;
эквивалентно:
(if x>maxValue) x = maxValue;
else x = x;
Я знаю, что высоки шансы, что он будет оптимизирован и т. Д., Или остановится при самостоятельном назначении и т. Д. Так что по сути это то же самое, что и первый if, только синтаксическое сахарное покрытие.
я хотел бы использовать min
так как это обеспечит безопасность типов и поможет избежать сравнения смешанных типов.