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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перетасовать биты. 
:(
    Опции темы
=Женек=
Дата 7.4.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Господа, есть 16-ти битное исходное число SRC.

И есть переменная DST в которую нужно переписать некоторые биты из SRC НЕ ТРОГАЯ остальные биты в DEST.

А именно 
DST.0 - SRC.2
DST.1 - SRC.3
DST.8 - SRC.13
DST.9 - SRC.14
DST.10 - SRC.15
DST.14 - SRC.0
DST.15 - SRC.1


Как это сделать?
PM MAIL   Вверх
Alexeis
Дата 7.4.2013, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Объявите структуру на 16 битовых полей и манипулируйте ими как нужно
Код

struct mytype
{
bool b0 : 1;
bool b1 : 1;
bool b2 : 1;
bool b3 : 1;
bool b4 : 1;
//...
bool b15 : 1;
};

Если биты означают что-то осмысленное, то можно назвать поля по человечески. Это не самый быстрый способ, но пожалуй самый читабельный. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
=Женек=
Дата 7.4.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне нужно проще без структур - пишу для микроконтроллера.
Сделал пока так:
EB |=((SRC>>2) & 0x0003) | (SRC<<14) | ((SRC & 0xE000)>>5);
Но биты, однажды установленные в единицу в следующий раз не обнуляются.
PM MAIL   Вверх
Dem_max
Дата 7.4.2013, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код для микроконтроллеров 

Код

typedef struct _BITS
{
   int bit0: 1;
   int bit1: 1;
   int bit2: 1;
   int bit3: 1;
   int bit4: 1;
   int bit5: 1;
   int bit6: 1;
   int bit7: 1;
} SBITS;
 
typedef union _BYTE
{
   unsigned char BYTE;
   SBITS BITS;
 
   operator [] (int i)
   {
      switch(i){
         case 0: return BITS.bit0;
         case 1: return BITS.bit1;
         case 2: return BITS.bit2;
         case 3: return BITS.bit3;
         case 4: return BITS.bit4;
         case 5: return BITS.bit5;
         case 6: return BITS.bit6;
         case 7: return BITS.bit7; 
      }
   }
} REGISTR;
 
REGISTR R0, R1, R2, R3;
 
int main()
{
      R0.BYTE = 0x00;
      int g = R0.BITS[1];
      R0.BITS.bit5 = 1;
      printf("Write R0 = %X", R0.BYTE);
      WritePort(R0.BYTE);
      R0.BYTE = ReadPort();
      printf("Read R0 = %X", R0.BYTE);
      WritePort(R0.BYTE);

      R0.BITS.bit5 = R3.BITS.bit7;
}


Это сообщение отредактировал(а) Dem_max - 7.4.2013, 14:19


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
=Женек=
Дата 7.4.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



от вашей конструкции компилятор переклинило....
Я хотел проще, пример привел. Чисто битовые операции.

Это сообщение отредактировал(а) =Женек= - 7.4.2013, 14:55
PM MAIL   Вверх
Alexeis
Дата 7.4.2013, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Структура не отнимает нисколько памяти. Так что это не сложно, но раз без структуры, то сначала нужно очистить в DST все биты которые нужно скопировать одной маской, затем записать, например вашим способом. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
=Женек=
Дата 7.4.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Господа, чтобы Вам понять в каком направлени двигаться приведу в пример аналогичную задачу - там 16-ти битное число нужно раскидать по двум портам напополам.
И делается это так:
Код

void Write_Dat(uint16_t LCD_Dat)
{
    LCD_CS = 0;
    LCD_RS = 1;
    GPIOC->ODR = (GPIOC->ODR&0xff00)|(LCD_Dat&0x00ff);
    GPIOB->ODR = (GPIOB->ODR&0x00ff)|(LCD_Dat&0xff00);
    LCD_WR = 0;
    LCD_WR = 1;    
    LCD_CS = 1;
}


uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
    uint16_t temp;
    Write_Cmd(LCD_Reg);  //дÈëÒª¶ÁµÄ¼Ä´æÆ÷ºÅ  
 
    GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x44444444; //½«¶Ë¿Ú¸ß8λÅäÖóÉÊäÈë
    GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x44444444; //½«¶Ë¿ÚµÍ8λÅäÖóÉÊäÈë  
    LCD_CS = 0;
    LCD_RS = 1;
    LCD_RD = 0;
    temp = ((GPIOB->IDR&0xff00)|(GPIOC->IDR&0x00ff)); //¶ÁÈ¡Êý¾Ý(¶Á¼Ä´æÆ÷ʱ,²¢²»ÐèÒª¶Á2´Î)    
    LCD_RD = 1;
    LCD_CS = 1; 
    GPIOB->CRH = (GPIOB->CRH & 0x00000000) | 0x33333333; //ÊͷŶ˿ڸß8λΪÊä³ö
    GPIOC->CRL = (GPIOC->CRL & 0x00000000) | 0x33333333; //ÊͷŶ˿ڵÍ8λΪÊä³ö
    return temp;   
}

PM MAIL   Вверх
Alexeis
Дата 7.4.2013, 15:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Код

DST &= 0x38FC; //очищаем все биты которые будем копировать
DST |= (SRC & 0x0004) >> (2-0); //выделили 2й бит и сдвинули его на нулевую позицию
DST |= (SRC & 0x0008) >> (3-1);//выделили 3й бит и сдвинули на 1ю позицию
DST |= (SRC & 0x1000) >> (13-8);//выделили 13й бит и сдвинули на 8ю позицию


Это сообщение отредактировал(а) Alexeis - 7.4.2013, 15:40


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
feodorv
Дата 7.4.2013, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(=Женек= @  7.4.2013,  16:11 Найти цитируемый пост)
(GPIOB->CRH & 0x00000000)

Не нравится мне это...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
=Женек=
Дата 7.4.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, но что-то вы напутали.
Если я ввожу в исходное число 0xFFFF то получаю 0b0000 0000 1000 0011, а должен получить 0b1100 0111 0000 0011

Это сообщение отредактировал(а) =Женек= - 7.4.2013, 16:16
PM MAIL   Вверх
Dem_max
Дата 7.4.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

от вашей конструкции компилятор переклинило....

Смени компилятор


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
=Женек=
Дата 7.4.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dem_max @ 7.4.2013,  16:17)
Цитата

от вашей конструкции компилятор переклинило....

Смени компилятор

обязательно. Когда закончу разработку)))
PM MAIL   Вверх
=Женек=
Дата 7.4.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Оххх.. получилось вот так:

Код

EB=((SRC <<3) & 0xFF80);





DB &= ~(0xC703); //очищаем все биты которые будем копировать
DB |= (SRC & 0x0004) >> (2-0); //выделили 2й бит и сдвинули его на нулевую позицию
DB |= (SRC & 0x0008) >> (3-1);//выделили 3й бит и сдвинули на 1ю позицию
DB |= (SRC & 0x2000) >> (13-8);//выделили 13й бит и сдвинули на 8ю позицию
DB |= (SRC & 0x4000) >> (14-9);//выделили 14й бит и сдвинули на 9ю позицию
DB |= (SRC & 0x8000) >> (15-10);//выделили 15й бит и сдвинули на 10ю позицию

DB |= (SRC & 0x0001) << (14);//выделили 0й бит и сдвинули на 14ю позицию
DB |= (SRC & 0x0002) << (14);//выделили 1й бит и сдвинули на 15ю позицию




А теперь по аналогии научите читать)))
PM MAIL   Вверх
volatile
Дата 8.4.2013, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(=Женек= @  7.4.2013,  17:00 Найти цитируемый пост)
Оххх.. получилось вот так:

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

я бы написал функцию, что-то типа 
Код

void move_bit (const int & src, int src_bit, int & dst, int dst_bit)
{
   int dst_mask = 1U << dst_bit;
   if (src & (1U << src_bit))
      dst |= dst_mask;
   else
      dst &= ~dst_mask;
}

теперь можно понятно перемещать биты, например:
Код

move_bit (SRC, 3, DST, 1);  //выделили 3й бит и сдвинули на 1ю позицию

сравните:
Цитата(=Женек= @  7.4.2013,  17:00 Найти цитируемый пост)
DB |= (SRC & 0x0008) >> (3-1);//выделили 3й бит и сдвинули на 1ю позицию


походу и обнулять изменяемые биты вначале не придецца.



Это сообщение отредактировал(а) volatile - 8.4.2013, 00:35
PM MAIL   Вверх
=Женек=
Дата 8.4.2013, 05:13 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

походу и обнулять изменяемые биты вначале не придецца.



Вы, видимо, не знаете тонкостей роаботы с микроконтроллерами. 
Я уже объяснял выше, что код должен быть низкоуровневый. Не на ассемлблере, конечно, но низкоуровневый.
А мне упорно шлют высший пилотаж.
Цитата

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

зато ваш код тормозной. Ну зачем каждый раз проверять состояние бита, если его можно записать как есть? Частота контроллера всего 72 МГц, а задача - работа с дисплеем.
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.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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