1. C++ / Говнокод #5712

    +176

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    __forceinline BYTE ClampShortToByte(signed short value)
    {
    	value>255?value=255:( value<0?value=0:NULL );
    
    	return (BYTE)value;
    }

    Запостил: Kirinyale, 18 Февраля 2011

    Комментарии (26) RSS

    • __forceinline не подсвечивается. )
      MS VS детектед.
      Ответить
    • Ох тут какой мудрёный ?:...
      На переменных сэкономили...
      Ответить
      • Не на переменных, а на ифах.

        if (value > 255) value = 255;
        else if (value < 0) value = 0;

        Хотя, кто-то мне как-то говорил, что вот такие извращения с тернарным оператором иногда компилятся оптимальнее, чем простые и понятные ифы. Может, ещё с инлайном будут грабли. Не знаю, не проверял. Но выглядит адско. Уж лучше бы асм вставили, если оптимальности захотелось.
        Ответить
        • Не. С ассемом было бы хуже. Функции, написанные на нём частично отрубают глобальную оптимизацию. (Тк затрудняется анализ кода для глобального оптимизатора оптимизирующих компиляторов). Так что асм не вариант.

          Им бы алгоритм поменять.
          Ответить
    • В данном случае нужны, очевидно, операторы :>= и :<=

      value :>= 0;
      value :<= 255;

      Также пригодился бы тернарный оператор :[]..

      value :[] 0 .. 255;
      Ответить
    • и NULL'ом дырку заткнули
      Ответить
      • как можно заткнуть струю говна? )
        Ответить
        • http://tinyurl.com/672g5yj
          Ответить
        • >как можно заткнуть струю говна? )
          http://4.bp.blogspot.com/_V-NIdiXuEfs/Sl00GXJLpmI/AAAAAAAAAsg/k5AAcBdXuvY/s400/Desmond+Ravenstone+UU+AssHat+and+Human+Butt+Plug.jpg
          Ответить
    • извращаться, так извращаться

      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));
      }
      Ответить
      • а где NULL?
        Ответить
        • нет дырки - нечего затыкать.
          Как минимум не имеет смысла мучать локальную стековую переменную value.
          В моем случае ее можно даже const сделать...

          inline BYTE ClampShortToByte(const signed short value)
          Ответить
    • Итак... Результат рефакторинга (мопед не мой):

      inline uint8 clampToUInt8(int value)
      {
      return (((((value << 23) >> 31) | value) & 0xFF) & ~(value >> 31)) & 0xFF;
      }
      Ответить
      • А проверить? Хотя бы для 666.
        Ответить
        • Проверили, уточнили (мопед, как уже говорил, не мой). Оказалось, всё несколько сложнее: сфера применения этого конкретного извращения - проигрывание видео, и предназначено оно для "чисел, приближенных к 255" (т.е., к примеру, результатов умножения числа, влазящего в байт, на какой-нибудь небольшой float). Для таких, как ни странно, работает, причём быстро.
          Ответить
          • Для таких вещей даже в сраном ммх есть команды с сатурацией (то есть то, что больше 255, становится 255), и ничего не надо вручную к 255 приводить.
            Ответить
    • По-моему, очевидно

      inline BYTE ClampShortToByte(short value)
      {
      return max((short)0, min(value, (short)255));
      }
      Ответить

    Добавить комментарий