Short, перестановка байтов

Дарова!Вопрос:Нужно в unsigned short поменять местами первый и второй байт.Поделитесь кодом...плиз...  
14 ответов

unsigned short a = 0xffcc;unsigned short tmp = a;a = (a >> 8) & 0x00FF ;a |= tmp << 8;


не люблю сдвигиписалось на коленке
typedef unsigned short ushort;ushort chenge_bytes(ushort var) { typedef unsigned char byte; byte first = var % 256; byte second = var / 256; return first*256 + second;}
если критично по скорости, то скорее всего компилер оптимизнет как надоЗЫ. кстати, стандарт не говорит, что sizeof(unsigned short) == 2 


ЗЫ. кстати, стандарт не говорит, что sizeof(unsigned short) == 2
Гм... А что он говорит?


он говорит1. sizeof(char) == sizeof(unsigned char) == 1;2. sizeof(char) <= sizeof(short) <=sizeof(int) <=sizeof(long);стандарта, как всегда, под рукой нету Добавлено через 52 секундыкроме того он говорит, что размер wchar_t тоже не обязательно 2 (чем меня окончательно убил  ) 


Alek86, Мдя... Вот тебе и стандарт...  


Что есть нормально. Компиляторо и платформо зависимые размеры типов данных


ну и на всякий случай мой вариант - без использования других переменных:
    unsigned short Source = 0xFF11;    *(unsigned char *)(&Source) ^= *((unsigned char *)(&Source)+1);    *((unsigned char *)(&Source)+1) ^= *(unsigned char *)(&Source);    *(unsigned char *)(&Source) ^= *((unsigned char *)(&Source)+1);


Что есть нормально. Компиляторо и платформо зависимые размеры типов данных
ничего хорошего в этом не вижуособенно про размер "юникодового чара"


Можно определять размер типа...
#include <iostream>#include <iomanip>template <class T_MY_INT>T_MY_INT chenge_bytes(T_MY_INT var){    const T_MY_INT shifts = sizeof(T_MY_INT) * 4;    return (var >> shifts) | (var << shifts);}int main(){    char my_char = 0x56;    std::cout << std::hex << my_char << "  " << chenge_bytes(my_char) << std::endl;    unsigned short short_int = 0xffcc;    std::cout << std::hex << short_int << "  " << chenge_bytes(short_int) << std::endl;    unsigned my_int = 0xaabbccdd;    std::cout << std::hex << my_int << "  " << chenge_bytes(my_int) << std::endl;    unsigned long long int long_int = 0x8899aabbccddeeff;    std::cout << std::hex << long_int << "  " << chenge_bytes(long_int) << std::endl;    return 0;}


return (var >> shifts) | (var << shifts);
мне кажется здесь может быть UB


Вопрос решен. Всем огромное спасибо!


Цитата(Gwendolen @  25.8.2008,  21:55 )
return (var >> shifts) | (var << shifts);
мне кажется здесь может быть UB
Почему? Не вижу ни единой причины для этого.


Цитата(Gwendolen @  25.8.2008,  21:55 )return (var >> shifts) | (var << shifts);мне кажется здесь может быть UB 
для UB в подобном случае должно быть еше и присваивание,  для двух (и более) членов ссылаюшихся на одну и ту же область памяти..в примере хоть и две var,  но они только отдают значение и присваивания для них нет...


Ещё такой вариант: 
unsigned short swap(unsigned short var){    __asm mov ax,var    __asm ror ax,8}
Добавлено @ 06:28
 return (var >> shifts) | (var << shifts);
Вот, кстати, реализация машинной команды ROR на С.