1. Си / Говнокод #10953

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    static inline int getKey(short int high, short int low)
    {
        return (((int)high)<<16)+(int)low;
    }
    
    static inline short getHigh(int pKey)
    {
        return (short)(pKey>>16);
    }
    
    static inline short getLow(int pKey)
    {
        return (short)(pKey&0x00000000FFFFFFFF);
    }

    вот так. getHigh() оставил для полноты.

    Запостил: Dummy00001, 14 Июня 2012

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

    • всё - так и задумано, как signed?
      getLow - всё равно обрежется, возможно даже компилятор соптимизирует
      Ответить
      • > всё - так и задумано, как signed?

        судя по getKey() - нет :)
        а может быть и да.
        задумайся: что произойдет если в low будет верхний бит установлен?

        > getLow

        да. но константа для обрезания в short радует.
        Ответить
        • >константа для обрезания в short

          128-битный процессор? :-)
          Ответить
      • Кстати, вспомнилось про оптимизации. Как-то тестировал вот такой код на gcc:
        uint32_t a = ..., b = ...;
        uint64_t x = a;
        uint64_t y = b;
        uint64_t r = x*y;
        uint32_t high = (r >> 32) & 0xFFFFFFFF;
        uint32_t low = r & 0xFFFFFFFF;

        Так gcc весь этот код превратил в один mul, который тут и задумывался ;)

        Так что, видимо, компилятор просто выкинет эту маску в getLow.
        Ответить
    • |? Не, не слышал.
      Ответить
      • | для лохов ;) Настоящие погромисты совмещают биты только сложением.
        Ответить
    • smoke weed and getHigh
      Ответить

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