![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 Как это сделать? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Объявите структуру на 16 битовых полей и манипулируйте ими как нужно
Если биты означают что-то осмысленное, то можно назвать поля по человечески. Это не самый быстрый способ, но пожалуй самый читабельный. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
мне нужно проще без структур - пишу для микроконтроллера.
Сделал пока так: EB |=((SRC>>2) & 0x0003) | (SRC<<14) | ((SRC & 0xE000)>>5); Но биты, однажды установленные в единицу в следующий раз не обнуляются. |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Код для микроконтроллеров
Это сообщение отредактировал(а) Dem_max - 7.4.2013, 14:19 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
от вашей конструкции компилятор переклинило....
Я хотел проще, пример привел. Чисто битовые операции. Это сообщение отредактировал(а) =Женек= - 7.4.2013, 14:55 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Структура не отнимает нисколько памяти. Так что это не сложно, но раз без структуры, то сначала нужно очистить в DST все биты которые нужно скопировать одной маской, затем записать, например вашим способом.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Господа, чтобы Вам понять в каком направлени двигаться приведу в пример аналогичную задачу - там 16-ти битное число нужно раскидать по двум портам напополам.
И делается это так:
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Это сообщение отредактировал(а) Alexeis - 7.4.2013, 15:40 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Спасибо, но что-то вы напутали.
Если я ввожу в исходное число 0xFFFF то получаю 0b0000 0000 1000 0011, а должен получить 0b1100 0111 0000 0011 Это сообщение отредактировал(а) =Женек= - 7.4.2013, 16:16 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Смени компилятор -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| =Женек= |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
обязательно. Когда закончу разработку))) |
||||
|
|||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Оххх.. получилось вот так:
А теперь по аналогии научите читать))) |
|||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
мда уж, в итоге читабельность кода на грани фантастики. я бы написал функцию, что-то типа
теперь можно понятно перемещать биты, например:
сравните:
походу и обнулять изменяемые биты вначале не придецца. Это сообщение отредактировал(а) volatile - 8.4.2013, 00:35 |
||||||
|
|||||||
| =Женек= |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Вы, видимо, не знаете тонкостей роаботы с микроконтроллерами. Я уже объяснял выше, что код должен быть низкоуровневый. Не на ассемлблере, конечно, но низкоуровневый. А мне упорно шлют высший пилотаж.
зато ваш код тормозной. Ну зачем каждый раз проверять состояние бита, если его можно записать как есть? Частота контроллера всего 72 МГц, а задача - работа с дисплеем. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |