- 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;
}
inkanus-gray 28.07.2015 13:57 # 0
guest 28.07.2015 14:04 # +4
inkanus-gray 28.07.2015 14:33 # 0
А с оптимизацией творятся чудеса. gcc и icc с ключом -O2 вставляют сдвиг, но при этом ещё работают с памятью:
Шланг вовсе обходится без работы с памятью:
P.S. Кто такой DIL?
bormand 29.07.2015 10:16 # +1
Как AL, только для DI. В x86_64 добавили.
inkanus-gray 29.07.2015 11:06 # 0
bormand 29.07.2015 11:21 # +2
inkanus-gray 31.07.2015 22:49 # 0
Если сделать инструкции для старшей половины 32- и 64-битных регистров, то также сдвиги на 16 и на 32 станут не нужны.
А если вообще представить основные регистры как массив 8-, 16- и 32-битных чисел, то в некоторых случаях отпадёт надобность в непонятных расширениях типа SSE.
bormand 29.07.2015 11:22 # +1
А может я стек не юзаю, и RSP для меня - регистр общего назначения?
guest 28.07.2015 20:40 # +3
return (a << 8) | (a >> 8);
}
bormand 29.07.2015 07:10 # 0
radmir 29.07.2015 11:24 # 0
mittorn 01.08.2015 19:45 # 0
radmir 02.08.2015 15:31 # 0
kegdan 02.08.2015 16:30 # 0
bormand 02.08.2015 17:25 # 0
kegdan 02.08.2015 17:45 # 0
bormand 02.08.2015 17:57 # 0
kegdan 02.08.2015 18:24 # 0
bormand 02.08.2015 18:27 # 0
Vasiliy 02.08.2015 18:30 # 0
kegdan 02.08.2015 18:38 # 0
kegdan 02.08.2015 18:54 # 0
Знакомая ситуация
Asen 02.08.2015 20:58 # 0