Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Помогите с битовой операцией. |
Автор: =Женек= 10.12.2009, 21:11 |
В общем ТЗ окончательно сформировалась и выглядит несколько по-иному. Задача следующая: имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать есть число из 8 бит типа aaaaaaaa. нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx |
Автор: djamshud 10.12.2009, 21:41 | ||
ТЗ на лабу?:)
|
Автор: =Женек= 10.12.2009, 22:02 |
Нет, собственный проект. И делать надо проще и универсальнее, так как работать должно на AVR контроллре. Уже дошел сам - вот PORTA = (PORTA & 0x8F) | (LINE[jj]<<4) ; |
Автор: djamshud 10.12.2009, 22:18 |
>а биты с байтами не перепутали ? Упс, точно.) >хотя даже в этом случае не нахожу общего с заданием... "x&mask|a&~mask" переставляет биты по заданию. Нужно просто правильно задать маску. Но может быть и слишком сложно.. Прошу прощения. |
Автор: mes 10.12.2009, 23:13 |
чего то мне кажется, что показанный набор операций оставит число без изменения. ![]() ![]() Вы ничего не упустили ? например сдвиг... ![]() |
Автор: djamshud 10.12.2009, 23:21 | ||
Скомпилировал, запустил.
Или по заданию нужно не это? >Вы ничего не упустили? Если правильно понял задание, то нет. Для четырех бит просто маска будет 0xF. Добавлено через 1 минуту и 55 секунд >чего то мне кажется, что показанный набор операций оставит число без изменения Т.е. сам x конечно сохраняется, а распечатывается результат. x=блаблабла, это наверное очевидно;). |
Автор: mes 11.12.2009, 01:07 | ||||
тут теперь я запарился.. принял "a" за "х"... сорри.. но
в любом случае без сдвига не обойтись.. с оговоренностью, что так как битов используется всего 7 и с учетом других условий приведенного случая, можем для 3 бит использовать 4 битовую маску.. хотя имхо логичнее было бы использовать маску 1000 1111b ![]() |
Автор: djamshud 11.12.2009, 11:32 |
Блин. Биты с байтами перепутал, порядок бит перепутал... Лузир, одним словом.) Пойду ка я в школу. |
Автор: =Женек= 11.12.2009, 12:27 |
А посоветуйте где накопать информации и примеров по битовым хитростям. То есть я в принципе знаю что дают операции &| << >>, но вот практическое их применение типа - вычислить значение бита №n, расположить биты в обратном порядке, заменить биты там-то и там-то... |
Автор: UniBomb 11.12.2009, 12:42 | ||
yyyxxxx = yyyxxxx&0x0F|aaaaaaaa&0x07<<4;
Есть замечательная книга "Алгоритмические трюки для программистов" за авторством Генри Уоррена младшего. |
Автор: =Женек= 11.12.2009, 13:16 | ||
у меня почему-то и без &0x07 работает |
Автор: mes 11.12.2009, 13:31 |
потому что Вам старший бит не важен.. |
Автор: UniBomb 11.12.2009, 13:44 |
Эта конструкция нужна затем, что компьютер не знает такого типа данных, в котором было бы семь бит. Только кратно восьми (ну не будем говорить про компьютеры с альтернативной разрядностью). Соответственно если в аааааааа начиная с 3-го (4-го если считать от 1) будут ненулевые биты, то они перенесутся в yyyxxxx после битов yyy, и получится уже число zyyyxxx (если переменная длинней 8-ми бит, то zzzzzyyyxxx). |