- 1
- 2
- 3
- 4
- 5
- 6
__forceinline BYTE ClampShortToByte(signed short value)
{
value>255?value=255:( value<0?value=0:NULL );
return (BYTE)value;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+176
__forceinline BYTE ClampShortToByte(signed short value)
{
value>255?value=255:( value<0?value=0:NULL );
return (BYTE)value;
}
MS VS детектед.
На переменных сэкономили...
if (value > 255) value = 255;
else if (value < 0) value = 0;
Хотя, кто-то мне как-то говорил, что вот такие извращения с тернарным оператором иногда компилятся оптимальнее, чем простые и понятные ифы. Может, ещё с инлайном будут грабли. Не знаю, не проверял. Но выглядит адско. Уж лучше бы асм вставили, если оптимальности захотелось.
Им бы алгоритм поменять.
value :>= 0;
value :<= 255;
Также пригодился бы тернарный оператор :[]..
value :[] 0 .. 255;
--
не удержался...
inline uint8_t ClampShortToByte(int16_t value)
{
return (uint8_t)(((value >> 8) & 0x7F) ? 0xFF : ((value & 0xFF))) * ((~(value >> 15) & 1));
}
лучше так (вспомним, что a=b?c:d на самом деле дает или a=c, или a=d):
inline BYTE ClampShortToByte(signed short value)
{
return (BYTE)(value>255?255:(value<0?0:value));
}
Как минимум не имеет смысла мучать локальную стековую переменную value.
В моем случае ее можно даже const сделать...
inline BYTE ClampShortToByte(const signed short value)
inline uint8 clampToUInt8(int value)
{
return (((((value << 23) >> 31) | value) & 0xFF) & ~(value >> 31)) & 0xFF;
}
inline BYTE ClampShortToByte(short value)
{
return max((short)0, min(value, (short)255));
}