Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
ТЗ на лабу?:)

Код

int main(){
int x=0x12345678;//src
int a=0x0xFEDCBA98;//some 8 bit
int mask=0xFFFF;//stored bits
printf("%X\n",x&mask|a&~mask);
return 0;
}

Автор: =Женек= 10.12.2009, 22:02
Нет, собственный проект. И делать надо проще и универсальнее, так как работать должно на AVR контроллре.
Уже дошел сам - вот   PORTA = (PORTA & 0x8F) | (LINE[jj]<<4) ;    

Автор: mes 10.12.2009, 22:04
Цитата(djamshud @  10.12.2009,  20:41 Найти цитируемый пост)
int x=0x12345678;//src
int a=0x0xFEDCBA98;//some 8 bit
int mask=0xFFFF;//stored bits

а биты с байтами не перепутали ? smile хотя даже в этом случае не нахожу общего с заданием...  smile 

Автор: djamshud 10.12.2009, 22:18
>а биты с байтами не перепутали ?

Упс, точно.)

>хотя даже в этом случае не нахожу общего с заданием...

 "x&mask|a&~mask" переставляет биты по заданию. Нужно просто правильно задать маску. Но может быть и слишком сложно..

Прошу прощения.

Автор: mes 10.12.2009, 23:13
Цитата(djamshud @  10.12.2009,  21:18 Найти цитируемый пост)
 "x&mask|a&~mask" переставляет биты по заданию


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

Автор: djamshud 10.12.2009, 23:21
Скомпилировал, запустил.
Цитата

FEDC5678


Или по заданию нужно не это?

>Вы ничего не упустили?

Если правильно понял задание, то нет. Для четырех бит просто маска будет 0xF.

Добавлено через 1 минуту и 55 секунд
>чего то мне кажется, что показанный набор операций оставит число без изменения

Т.е. сам x конечно сохраняется, а распечатывается результат. x=блаблабла, это наверное очевидно;).

Автор: mes 11.12.2009, 01:07
Цитата(djamshud @  10.12.2009,  22:21 Найти цитируемый пост)
Т.е. сам x конечно сохраняется, а распечатывается результат. x=блаблабла, это наверное очевидно;). 

тут теперь я запарился.. принял "a" за "х"... сорри.. но 
Цитата(=Женек= @  10.12.2009,  20:11 Найти цитируемый пост)
имеется 7 бит: yyyxxxx  
нужно взять 3 младшие бита и поместить их на место yyy, 

в любом случае без сдвига не обойтись.. 

Цитата(djamshud @  10.12.2009,  22:21 Найти цитируемый пост)
Для четырех бит просто маска будет 0xF.

с оговоренностью, что  так как битов используется всего 7 и с учетом других условий приведенного случая, можем для 3 бит использовать 4 битовую маску..
хотя имхо логичнее было бы использовать маску  1000 1111b
 smile 

Автор: 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:27 Найти цитируемый пост)
А посоветуйте где накопать информации и примеров по битовым хитростям.

Есть замечательная книга "Алгоритмические трюки для программистов" за авторством Генри Уоррена младшего.

Автор: =Женек= 11.12.2009, 13:16
Цитата

yyyxxxx = yyyxxxx&0x0F|aaaaaaaa&0x07<<4;

у меня почему-то и без &0x07 работает

Автор: mes 11.12.2009, 13:31
Цитата(=Женек= @  11.12.2009,  12:16 Найти цитируемый пост)
у меня почему-то и без &0x07 работает 

потому что Вам старший бит не важен..

Автор: UniBomb 11.12.2009, 13:44
Цитата(=Женек= @  11.12.2009,  14:16 Найти цитируемый пост)
у меня почему-то и без &0x07 работает

Эта конструкция нужна затем, что компьютер не знает такого типа данных, в котором было бы семь бит. Только кратно восьми (ну не будем говорить про компьютеры с альтернативной разрядностью). Соответственно если в аааааааа начиная с 3-го (4-го если считать от 1) будут ненулевые биты, то они перенесутся в yyyxxxx после битов yyy, и получится уже число zyyyxxx (если переменная длинней 8-ми бит, то zzzzzyyyxxx).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)