2015-02-05 2 views
3

В интервью мне было предложено реализовать big_to_little_endian() в качестве макроса. Я реализовал использование оператора сдвига. Но интервьюер хочет, чтобы я оптимизировал это дальше. Я не мог этого сделать. Позже я googled & искал, но не смог найти его. Может кто-то помочь в понимании того, как дальше оптимизировать этот код?Оптимизированный код для преобразования большого и малого двоичного кода

#define be_to_le (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) 
+1

Выглядит хорошо для меня. Возможно, он искал инструкцию ASM 'shuffle' для использования? Должен ли хороший компилятор сделать это уже? – leppie

+4

Помимо этого: вместо того, чтобы изобретать колесо, следует использовать ['ntohl'] (http://linux.die.net/man/3/ntohl) или эквивалент, предоставляемый вашей платформой. Возможно, вы добавили этот момент вежливо, как только вы написали этот ответ :) – legends2k

+3

[Этот ответ] (http://stackoverflow.com/a/105339/183120) показывает самый быстрый способ, используя встроенные функции компилятора. – legends2k

ответ

3

Он мог быть в виду, используя 16-битную цит поменять местами два верхних слова, то с помощью 8-битных опа поменять байты в них - сохраняет пару инструкций, проще всего сделать в союзе, хотя C технически не нравится (но многие компиляторы будут принимать его), и он по-прежнему компилятор зависит, так как вы надеетесь, компилятор оптимизирует пару вещи из:

union dword { 
    unsigned int i; 
    union shorts { 
    unsigned short s0, s1; 
    union bytes { 
     unsigned char c0, c1, c2, c3; 
    } c; 
    } s; 
}; 

union dword in = (union dword)x; 
union dword temp = { x.s.s1, x.s.s0 }; 
union dword out = { temp.s.c.c1, temp.s.c.c0, temp.s.c.c3, temp.s.c.c2 }; 

даже не действует C, но вы получите (и я не думаю, что компилятор даже испустит то, на что я надеюсь).

Или вы можете сохранить op, но ввести зависимость данных, поэтому, вероятно, работает медленнее.

temp = (x << 16) | (x >> 16) 
out = ((0xff00ff00 & temp) >> 8) | (0x00ff00ff & temp) << 8) 

Лучший просто использовать компилятор присущую, поскольку он отображает до одной bswap инструкции.

Смежные вопросы