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

Поиск:

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


Новичок



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

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



Привет форум!
Есть у меня программа одна которая работает с очень хитрым девайсом...для работы надо просто читать/писать в открытый ком порт...НО загвоздка в том что это надо делать на битовом уровне...

Итак, у прибора есть ID номер. В моем случае это 022360 (как я понял из техзадания это будет просто число 22360). Так вот мне нужно этот номер представить в двоичном виде и записать в порт следующим образом (а19-а0 - ID номер в двоичном формате):

№байта                             Порядок бит
                        7      6      5       4      3     2     1     0
    
   1                   1      1    а19   а18   а17  а16  а15  а14

   2                   0   а13  а12   а11   а10   а9    а8    а7

   3                   0    а6   а5     а4     а3    а2    а1    а0

Но это еще не все....прибор мне выдает однобайтовый ответ в котором четвертый БИТ скажет мне о том установлено ли соединение или нет...Затем я опять посылаю ему какое-то число (уже постоянное, можно использовать float) и он возвращает мне нужное значение !ВНИМАНИЕ! в котором нужно ПОМЕНЯТЬ МЕСТАМИ биты чтобы получилось стандартное число в формате float...

ВОПРОС: что лучше использовать чтобы максимально просто работать на битовом уровне (менять порядок бит в произвольном порядке) а потом конвертировать значение обратно в число? Union из float и битового поля подходит для битовых операций но нужна большая гибкость...возможность переставлять биты местами...Подскажите что использовать и если сможете маленькие примерчики как это делается...Не могу ничего подходящего найти...

Всем спасибо за внимание!
PM MAIL   Вверх
archimed7592
Дата 16.12.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Думаю, тебе будет достаточно ф-циональности std::bitset.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
blackdevil
Дата 16.12.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо archimed7592 я и не сомневался что именно ты мне ответишь )) Сейчас погуглю на эту тему...

Это сообщение отредактировал(а) blackdevil - 16.12.2007, 19:59
PM MAIL   Вверх
archimed7592
Дата 16.12.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



К слову, union - это плохо. Особенно в данном контексте.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
baldina
Дата 16.12.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 15
Всего: 101



bitset штука хорошая, но не решает все проблемы, представленные здесь.
union + битовые поля имхо вполне хорошее решение (именно для таких целей)
вот пример:

Код

struct data {
    unsigned unused1:2;
    unsigned a19_a14:6;
    unsigned unused2:1;
    unsigned a13_a7  :7;
    unsigned unused3:1;
    unsigned a6_a0    :7;
};

union u {
  unsigned char raw[3];
  data d;
};

void read (unsigned char&); // <- u.raw[i]
unsigned long getnum (const data& d) // <- u.d
{
  return (d.a19_a14 << 14) | (d.a13_a17 << 7) | a6_a0;
}


без union такое можно сделать только приведением типа, что имхо гораздо хуже.

битовые поля позволяют также менять биты местами (обычным алгоритмом swap через временную переменну; можно показать класс использованием ^ smile) Чтоб обменять местами половинки переменной, выровненные по границе байта, можно без битовых операций опять же использовать union.

Все это хозяйство инкапсулируем в класс, и с union будет работать только реализация класса. Чем это плохо?
PM MAIL   Вверх
blackdevil
Дата 17.12.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо огромное за пример! Все понял кроме строки с return потому что просто не помню битовые операции...я когда хотел использовать union не думал сделать именно так...интересная идея....

Цитата

К слову, union - это плохо. Особенно в данном контексте. 

блин, мнение эксперта настораживает...
PM MAIL   Вверх
archimed7592
Дата 17.12.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(blackdevil @  17.12.2007,  00:42 Найти цитируемый пост)
блин, мнение эксперта настораживает... 

В принципе, т.к. ты работаешь с аппаратурой, то можешь не заморачиваться smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 17.12.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Код

static inline void convert(unsigned int * value) {
    __asm__("bswap %0 ; shrl $8, $0 ; rolw $2, %ax ; shrb $1, %ah ; orb $0xC0, %al ; andb $0xFE, %ah ; btrl $23, %0 ; adcb $0, %ah" : "=a" : "0" (*value))



Это сообщение отредактировал(а) MAKCim - 17.12.2007, 11:12


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
blackdevil
Дата 20.12.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim это ассемблер? )) 

Ребят подскажите самое начало...мне надо число 22360 представить в двоичном виде а потом уже буду загонять в bitset со структурой как в 1-ом посте. Как число представить в двоичном виде? Думаю использовать union. Просто пользование и union и bitset одновременно некрасиво как-то...

Это сообщение отредактировал(а) blackdevil - 20.12.2007, 01:34
PM MAIL   Вверх
Cycle
Дата 26.1.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 3



Код

    std::bitset<16> bs=std::bitset<16>(22360);
    std::cout<<bs.to_ulong();

PM MAIL   Вверх
TeAnton
Дата 30.1.2008, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А мне кажется, что ^ | & ~ >> << хватит выше крыши.

Код

unsigned char z[3];
unsigned id = 22360;
z[2] = id & 0x7f;
z[1] = (id >> 6) & 0x7f;
z[0] = (id >> 13) & 0x7f | 0xc0;

PM MAIL   Вверх
TeAnton
Дата 31.1.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Последнюю строчку правильно вот так записать:
Код

z[0] = (id >> 13) | 0xc0;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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