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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевернуть байт, Наизнанку:) 
:(
    Опции темы
azesmcar
Дата 23.12.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Проблема такая, допустим у меня есть байт...
в котором записано
00001101
т.е.
1101
и мне приспичило его перевернуть, т.е. получить 1011
Кто нибудь знает как это сделать (притом довольно быстро, циклами и я могу)...
Нужно битовыми операциями...заранее благодарю..
PM   Вверх
Akina
Дата 23.12.2004, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



на АСМе

Код

mov ax,num
mov cl,16
repeat:
rcr ax,1
rcl dx,1
loop repeat
mov num,dx



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bel_nikita
Дата 23.12.2004, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



в асме есть инструкция: bswap smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 23.12.2004, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата

на АСМе

АСМ это конечно прекрасно, но без итераций...

Цитата

в асме есть инструкция: bswap

Тут другая проблема, программа работает на процесоре моторола, тестируется на процесоре интел...на асме никак, там другой ассемблер, да и к тому же на мотороле линукс, на интелет виндоуз...тот же самый bswap на с++ не перевели?
Добавлено @ 12:55
Можно конечно помучиться с #define -ами, но тогда если не сложно (дабы не открывать новую тему в линуксе) сразу здесь можете сказать как на линуксе асм писать???
Надоел он мне, пишешь примитивный
Код

__asm
{
  mov ax, 16h
}

не компилируется..
PM   Вверх
Akina
Дата 23.12.2004, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(azesmcar @ 23.12.2004, 13:53)
не компилируется..

пишем на АСМе, компилим Сями... тьфу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
oleg1973
Дата 23.12.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

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



у GCC в линюхе синтаксис AT
поэтому
Цитата

__asm
{
  mov ax, 16h
}

он просто не понимает

интересно конешно
как вы там пишете под моторолу на асме а тестите не интеле?
там же все вообще подругома


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 23.12.2004, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Кто сказал что я пишу на асме??? я спросил как написать это на С++
И вообще программа вся пишется на С++...про ассемблер я в вопросе даже не упоминал...
Если интересно как компилировать под моторолу могу сказать..
ppc_8xx-g++ из командной строки линукса...

Цитата
там же все вообще подругома


Кстати заметь я сказал
Цитата
...на асме никак, там другой ассемблер

И еще сказал можно написать

Код

#ifndef __MOTOROLA //значит это интел
__asm
{
;тут соответствующий код
}
#else
_asm
{
;тут тоже
}
#endif


Цитата
пишем на АСМе, компилим Сями... тьфу.

А что, совсем недопустимо??? Если пишешь на си, и программа должна работать довольно быстро в критических функциях можно (я бы даже сказал нужно) использовать ассемблер...
Если эта функция вызывается где то 100000 раз как поступишь ты??? всю прогу на ассемблере будешь писать???

Это сообщение отредактировал(а) azesmcar - 23.12.2004, 13:20
PM   Вверх
bel_nikita
Дата 23.12.2004, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
Можно конечно помучиться с #define -ами, но тогда если не сложно (дабы не открывать новую тему в линуксе) сразу здесь можете сказать как на линуксе асм писать???
А зачем мучаться smile
Вот, так вот делаешь:
Код
#define bytereverse(x)   ((((x)&0x01) << 7) | \
                         (((x)&0x02) << 5) | \
                         (((x)&0x04) << 3) | \
                         (((x)&0x08) << 1) | \
                         (((x)&0x10) >> 1) | \
                         (((x)&0x20) >> 3) | \
                         (((x)&0x40) >> 5) | \
                         (((x)&0x80) >> 7) )
...
 char a = 0x53;
 printf("\na =%08X",a);
 char b = bytereverse(a);
 printf("\na =%08X",b);
...

И пофигу все процы и Оси. Будь то моторола, будь то интел, будь то виндовоз, будь то линукс.
Кроссплатформенность, однако smile JAVA - отдыхает smile

Добавлено @ 13:24
Вот, еще на всякай случай smile
Код

#define  bswap_16(x)   (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8)
#define  bswap_32(x)   ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
                       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
...
 int a = 0xAABBFF53;
 printf("\na =%08X",a);
 int b =  bswap_32(a);
 printf("\na =%08X",b); //  получаем 0x53FFBBAA
...

Тоже кроссплатформеность, однако smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mad
Дата 23.12.2004, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



azesmcar
А зачем вообще эта операция ? Может и без нее обойтись можно ?


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


uploading...
****


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

Репутация: 81
Всего: 211



Цитата

Код

#define  bswap_16(x)   (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8)
#define  bswap_32(x)   ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
                      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))



Ну это уже ясно smile так мне и нужно кроссплатформенное...
Хорошее решение кстати...подойдет, осталось unsigned добавить...smile (ну это уж я как нибудь сам справлюсь ;) мало ли книжек хороших на белом свете)
Спасибо...
PM   Вверх
Mad
Дата 23.12.2004, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(bel_nikita @ 23.12.2004, 12:19)
Код

#define  bswap_16(x)  (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8)
#define  bswap_32(x)  ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
                      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
...
int a = 0xAABBFF53;
printf("\na =%08X",a);
int b =  bswap_32(a);
printf("\na =%08X",b); //  получаем 0x53FFBBAA
...


Тоже кроссплатформеность, однако

Ты забыл, что у разных процов, разное хранение WORD и DWORD smile


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


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
осталось unsigned добавить...
а там можно через union Сделать


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Elm
Дата 23.12.2004, 13:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если критично время выполнения, надо сделать таблицу из 256 элементов, к которой и обращаться. :-)
  Вверх
azesmcar
Дата 23.12.2004, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Mad на интеле биты записываются в обратном порядке...
перед тем как читать последовательность битов если это интел нужно перевернуть байт, в другом случае нет...у меня написан код который вытворяет то что нужно без всего этого но он унивесален..и как все унивесальное работает медленно...

если это интел и программа работает немного медленней в принципе ничего трагического из этого не выйдет...а вот под линукс она не должна тормозить...написать простой код который будет читать на мотороле (под линукс), а под виндоуз просто перед этим переворачивать будет (по моему) немного быстрее
Добавлено @ 13:42
Цитата
Ты забыл, что у разных процов, разное хранение WORD и DWORD 

перед тем как вызывать макрос я уже знаю на каком проце он работает...
PM   Вверх
Mad
Дата 23.12.2004, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



azesmcar
Или я чтото перепутал, или ты smile

Проблемма, вроде, начинается с WORD (разная очередность LOBYTE и HIBYTE)


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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