Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> short, перестановка байтов 
V
    Опции темы
andrew_121
Дата 25.8.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 25.8.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

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

PM MAIL Skype GTalk   Вверх
Alek86
Дата 25.8.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не люблю сдвиги
писалось на коленке

Код

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 smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
andrew_121
Дата 25.8.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Alek86 @  25.8.2008,  18:33 Найти цитируемый пост)
ЗЫ. кстати, стандарт не говорит, что sizeof(unsigned short) == 2

Гм... А что он говорит?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Alek86
Дата 25.8.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



он говорит

1. sizeof(char) == sizeof(unsigned char) == 1;
2. sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long);

стандарта, как всегда, под рукой нету smile

Добавлено через 52 секунды
кроме того он говорит, что размер wchar_t тоже не обязательно 2 (чем меня окончательно убил smile ) 


--------------------
user posted image    user posted image
PM MAIL   Вверх
andrew_121
Дата 25.8.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
cutwater
Дата 25.8.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



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


--------------------
user posted image
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



ну и на всякий случай мой вариант - без использования других переменных:
Код
    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);



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Alek86
Дата 25.8.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(cutwater @  25.8.2008,  19:30 Найти цитируемый пост)
Что есть нормально. Компиляторо и платформо зависимые размеры типов данных

ничего хорошего в этом не вижу
особенно про размер "юникодового чара"


--------------------
user posted image    user posted image
PM MAIL   Вверх
Gwendolen
Дата 25.8.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 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;
}


--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
Lazin
Дата 25.8.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Gwendolen @  25.8.2008,  21:55 Найти цитируемый пост)
return (var >> shifts) | (var << shifts);

мне кажется здесь может быть UB
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 25.8.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 25.8.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Lazin @ 25.8.2008,  22:14)
Цитата(Gwendolen @  25.8.2008,  21:55 Найти цитируемый пост)
return (var >> shifts) | (var << shifts);

мне кажется здесь может быть UB

Почему? Не вижу ни единой причины для этого.
PM   Вверх
mes
Дата 25.8.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lazin @  25.8.2008,  22:14 Найти цитируемый пост)
Цитата(Gwendolen @  25.8.2008,  21:55 )
return (var >> shifts) | (var << shifts);


мне кажется здесь может быть UB 


для UB в подобном случае должно быть еше и присваивание,  для двух (и более) членов ссылаюшихся на одну и ту же область памяти..
в примере хоть и две var,  но они только отдают значение и присваивания для них нет...


--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 26.8.2008, 06:26 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Ещё такой вариант: 

Код

unsigned short swap(unsigned short var)
{
    __asm mov ax,var
    __asm ror ax,8
}


Добавлено @ 06:28
Цитата(Gwendolen @  25.8.2008,  21:55 Найти цитируемый пост)
 return (var >> shifts) | (var << shifts);


Вот, кстати, реализация машинной команды ROR на С. 

Это сообщение отредактировал(а) W4FhLF - 26.8.2008, 06:29


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0638 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.