- 1
- 2
- 3
- 4
- 5
uint16_t swap_bytes(uint16_t a){
uint16_t tmp = *((uint8_t*)&a+1);
*(((uint8_t*)&tmp)+1) = *((uint8_t*)&a);
return tmp;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1000
uint16_t swap_bytes(uint16_t a){
uint16_t tmp = *((uint8_t*)&a+1);
*(((uint8_t*)&tmp)+1) = *((uint8_t*)&a);
return tmp;
}
А с оптимизацией творятся чудеса. gcc и icc с ключом -O2 вставляют сдвиг, но при этом ещё работают с памятью:
Шланг вовсе обходится без работы с памятью:
P.S. Кто такой DIL?
Как AL, только для DI. В x86_64 добавили.
Если сделать инструкции для старшей половины 32- и 64-битных регистров, то также сдвиги на 16 и на 32 станут не нужны.
А если вообще представить основные регистры как массив 8-, 16- и 32-битных чисел, то в некоторых случаях отпадёт надобность в непонятных расширениях типа SSE.
А может я стек не юзаю, и RSP для меня - регистр общего назначения?
return (a << 8) | (a >> 8);
}
Знакомая ситуация