У меня есть простая функция C следующим образом:Зажимных короткий неподписанный символ
unsigned char clamp(short value){
if (value < 0) return 0;
if (value > 0xff) return 0xff;
return value;
}
Можно ли переписать его без использования какого-либо если/другое разветвления в то же время эффективным?
EDIT:
Я в основном хотел бы видеть, если некоторые побитовое арифметика на основе реализации зажима возможно. Цель состоит в обработке изображений на графическом процессоре (графическом процессоре). Этот тип кода будет работать на каждом пикселе. Я предполагаю, что если ветви можно избежать, общая пропускная способность по сравнению с графическим процессором будет выше.
Решение, подобное (значение < 0? 0: ((значение> 255)? 255: значение)) - это просто перефразирование if/else, ветвящегося синтаксическим сахаром. Поэтому я не ищу его.
EDIT 2:
Я могу сократить его до одного, если так, но я не могу думать лучше:
unsigned char clamp(short value){
int more = value >> 8;
if(more){
int sign = !(more >> 7);
return sign * 0xff;
}
return value;
}
EDIT 3:
Просто увидел очень хороший реализация этого в коде FFmpeg:
/**
* Clip a signed integer value into the 0-255 range.
* @param a value to clip
* @return clipped value
*/
static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
{
if (a&(~0xFF)) return (-a)>>31;
else return a;
}
Это, безусловно, работает и сводит его к одному, если славно LY.
просто краткое замечание по терминологии, я считаю, что это обычно называют зажимным устройством, а не отсечением, и если это делается в сочетании с вычислениями, это обычно называют «арифметикой насыщения», может помочь, если вы ищете. – falstro
Зачем вам это нужно? Это выглядит довольно эффективно. – JeremyP
У вас есть 'abs()' на GPU? –