Он мог быть в виду, используя 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
инструкции.
Выглядит хорошо для меня. Возможно, он искал инструкцию ASM 'shuffle' для использования? Должен ли хороший компилятор сделать это уже? – leppie
Помимо этого: вместо того, чтобы изобретать колесо, следует использовать ['ntohl'] (http://linux.die.net/man/3/ntohl) или эквивалент, предоставляемый вашей платформой. Возможно, вы добавили этот момент вежливо, как только вы написали этот ответ :) – legends2k
[Этот ответ] (http://stackoverflow.com/a/105339/183120) показывает самый быстрый способ, используя встроенные функции компилятора. – legends2k